$timeout внутри цикла will создает бесконечный цикл


Я не могу заставить тайм-аут и цикл работать вместе. Если я удаляю цикл, он работает или если я удаляю тайм-аут, он будет работать. Вместе я получу бесконечный цикл, и не похоже, что функция timeout когда-либо работает, если она находится внутри цикла while.

Любая помощь будет оценена!

function doTask (list) {
    if (list) {
        while (list.length > 0) {  
            (function(list){
                $timeout(function() {   
                   list.splice(0, 1); 
                   console.log("timeout...") 
                }, 5000); 
            })(list); 
        }
    }
}
2 2

2 ответа:

Вы должны использовать рекурсию для цикла. Кроме того, вы должны проверить list.length, поскольку [] является истинным значением.

function doTask(list) {
  if (list.length) {
    setTimeout(function() {
      list.splice(0, 1);
      console.log("timeout...")
      doTask(list);
    }, 500);
  }
}
var list = [1,2,3,4,5]
doTask(list);

Ваш код никогда не дает возможности запустить функцию timeout.

При вызове doTask он переходит в стек для запуска. Теперь в каждой итерации цикла вы регистрируете тайм-аут, который будет выполнен, когда эта задача doTask завершится. Но вы никогда не давали шанса на тайм-аут, поэтому длина списка никогда не уменьшалась, поэтому он работает вечно.

Надеюсь, это прояснит ваш запрос.