2014-11-13 5 views
1

Я использую Q.js и имею ряд функций, которые возвращают обещания, скованные вместе с последующими обратными вызовами, потому что мне нужно их выполнить в порядке as a sequence.Q.all с закодированной последовательностью

var promiseOne = one(); 
promiseOne.then(two).then(three).done(); 

У меня также есть некоторые обещания, которые могут произойти в любое время. Мне нужно знать, когда все они будут решены, включая последний, а затем перезвоним в цепочке обещаний. Я пытался использовать Q.all.then, но он достигнет Q.all тогдашнего прежде чем некоторые из этих обещаний -

Q.all([promiseOne, anotherPromise]).then(function(results) { 

    // will hit this before chain above is done 
}); 

в моем jsfiddle Например, я только иметь одно обещание в Q.all, но в действительности это один из многих. Есть ли способ сделать эту работу тем, что я могу знать, когда все, в том числе прикованные, решены?

jsfiddle: http://jsfiddle.net/98rq0bs6/1/

ответ

2

Обещание не знает, что был прикован к нему. Однако вызов .then() действительно возвращает новое обещание, которое будет знать, от чего оно было связано. Вам нужно будет взять это новое обещание, которое представляет результат цепных действий и ждет его - вместо promiseOne, который был только первым звеном в цепочке.

var promiseOne = one(); 
var promiseChain = promiseOne.then(two).then(three); 

Q.all([promiseChain, anotherPromise]).then(function(results) { 
//  ^^^^^^^^^^^^ wait for the chain 
    … 
}).done(); 
+0

Я понимаю идею, но а не механика того, как она на самом деле работает. Например, кажется, что как только вы привяжете «то» к обещанию, он будет знать о цепочке. Если это не возможно, потому что, возможно, это уже разрешено, похоже, что вы не сможете это сделать. – user210757

+0

Оригинальное обещание знает только о обработчике, и оно должно называть его, когда оно разрешается. Но он не знает, что делает этот обработчик, а не о новом обещании, которое будет устранено с результатом вызова обработчика. В 'promTwo = summOne.then (two)', когда вы связываете другой обработчик с именем 'promOne', он будет вызван одновременно с' two'. Если вы хотите, чтобы обработчик ожидал 'two' и получил его возвращаемое значение, вам нужно связать его с' promTwo'. – Bergi

0
var listOfItems = [1, 2, 3, 4, 5]; 

// Creating an empty initial promise that always resolves itself. 
var promise = $q.all([]); 

// Iterating list of items. 
angular.forEach(listOfItems, function (item) { 
    promise = promise.then(function() { 
    return $timeout(function() { 
     console.log('Item executed: ' + item); 
    }, 2000); 
    }); 
}); 

promise.finally(function() { 
    console.log('Chain finished!'); 
}); 

Source, В этом решении «angular.forEach» сделать возможным, что каждое обещание выполняется в цепи, иными словами, быть последовательность promises's

+0

Пожалуйста, не только скопируйте код с другой страницы, но и добавьте текст объяснения. –

+1

я сделал, спасибо за ваш совет @Markus Weninger –

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