2014-11-28 3 views
2

как подождать, пока все AngularJS '$timeouts не будут выполнены?AngularJS ждать до тех пор, пока не будут выполнены многие таймауты

for (var i = 0; i < 1000; i++) { 
    $timeout(function() { 
     //do sth 
    }, 100); 
}; 

//then do something else is all $timeouts are done 
+0

Я не могу думать о родном решении, но это очень легко реализовать какой-то менеджера асинхронным, где каждый вызов метода запуска (вызывается при установке таймер) увеличивает счетчик, и каждый вызов метода останова (вызываемый при завершении работы асинхронной функции) уменьшает его. Окончательный ответ можно вызвать, когда счетчик вернется к 0. – doldt

ответ

3

Вы можете использовать обещание, возвращаемые таймауты и с комбинацией $q.all (инъекционные $q) вы можете достичь этого.

Пример: -

var promises = []; 

for (var i = 0; i < 1000; i++) { 
    promises.push(performTask(i)); //push promise to the array 
} 


//If in your real case i is actually an array of something then you can 
//just simplify it to $q.all(myArrayOfInputs.map(performTask)).then(...) 

$q.all(promises).then(performDoneTask); //use q.all to wait for all promises to be fulfilled. 

//Method that does something once all the timeouts are completed 
function performDoneTask(){ 

} 

//Method that does something with i and returns a promise from the timeout 
function performTask(i){ 
    return $timeout(function() { 
     //do sth 
    }, 100); 
} 
+0

Хммм спасибо за это - до сих пор я создавал пользовательское обещание (с помощью $ q) и обертывал все остальные внутри него уведомлениями и т. Д. - это тоже приятно, как всегда для некоторых из моих целей лучше использовать wrapperpromise. В любом случае, спасибо. – Seti

+0

@seti Выполнение пользовательских обещаний означает создание отложенного объекта с помощью $ q? Для чего вам не нужно (если нет другого варианта), потому что тайм-аут уже возвращает обещание. Прочтите это http://stackoverflow.com/questions/23803743/what-is-the-deferred-antipattern-and-how-do-i-avoid-it – PSL

+0

Да, отложенный $ q. – Seti

Смежные вопросы