2017-02-07 21 views
4

Я довольно хорошо знаком с тем, как работает $q, и я использую его в angularjs, чтобы подождать, пока будут разрешены единственные обещания, и несколько обещаний для решения с $q.all().

Вопрос в том, что я не уверен, если это возможно сделать (и если оно будет работать правильно): Могу ли я ждать единственного обещания для решения, но затем также запускать некоторый код, когда все мои обещания также разрешаются. . После успеха обратные вызовы отдельных обещаний закончили ... к примеру:

var promises = []; 
for(i=1, i<5, i++){ 
    var singlePromise = SomeSevice.getData(); 
    promises.push(singlePromise); 
    singlePromise.then(function(data){ 
     console.log("This specific promise resolved"); 
    }); 
} 


// note: its important that this runs AFTER the code inside the success 
// callback of the single promise runs .... 
$q.all(promises).then(function(data){ 
    console.log("ALL PROMISES NOW RESOLVED"); // this code runs when all promises also resolved 
}); 

Мой вопрос, делает эту работу, как я думаю, что он делает, или есть какой-то странный асинхр, индетерминисти- результат риска?

+0

Hi @lonesomeday, я внес небольшое изменение в мой вопрос; основным требованием является то, что обратный вызов all() запускается после успешного завершения обратного вызова отдельных обещаний! – rex

+0

Я видел это и удалял свой комментарий, потому что он больше не был актуальным. – lonesomeday

+0

Итак, ваш вопрос на самом деле, если 'callback.all' всегда запускается ** после ** последнего обратного вызова' singlePromise.then'? – devqon

ответ

5

Обращение к then также возвращает обещание. Затем вы можете передать это в свой массив вместо первоначального обещания. Таким образом, ваш $q.all будет запущен после того, как все ваши then s были выполнены.

var promises = []; 
for(i=1, i<5, i++){ 
    // singlePromise - this is now a new promise from the resulting then 
    var singlePromise = SomeSevice.getData().then(function(data){ 
     console.log("This specific promise resolved"); 
    }); 
    promises.push(singlePromise); 
} 

$q.all(promises).then(function(data){ 
    console.log("ALL PROMISES NOW RESOLVED"); 
}); 
+1

Звучит блестяще - я попробую. – rex

+2

Если обещание потерпит неудачу, все обещания цепочки прекратятся, но если вы поместите улов в индивидуальное обещание, обещание цепи продолжится, и каждое обещание с уловом будет возвращено не определено в индексе массива prom.all. –

+0

@ RafaelDantas - хорошая точка. Дело не в том, что я не считал это, но еще больше, что я чувствовал, что это выходит за рамки вопроса. OP обязательно должен рассмотреть его в своем окончательном коде, чтобы убедиться, что код является отказоустойчивым. – Igor