2016-11-23 5 views
2

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

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

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

Thats, потому что вы меняете длину в setTimeout, которая будет вызвана через 5 секунд, но выйдет из строя, не получив вызов, так как ваш код никогда не выйдет из цикла – Rajesh

+0

Что вы на самом деле хотите достичь? – Sandeeproop

+0

Я хотел бы зациклиться до тех пор, пока список не будет пуст, но задержит цикл. –

ответ

4

Вы должны использовать рекурсию для цикла. Кроме того, вы должны проверить 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);

+0

Отлично! Спасибо! –

2

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

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

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