Итак, у меня есть ситуация, когда у меня есть несколько цепочек обещаний неизвестной длины. Я хочу, чтобы какое-то действие выполнялось, когда все ЦЕПИ были обработаны. Это вообще возможно? Вот пример:
app.controller('MainCtrl', function($scope, $q, $timeout) {
var one = $q.defer();
var two = $q.defer();
var three = $q.defer();
var all = $q.all([one.promise, two.promise, three.promise]);
all.then(allSuccess);
function success(data) {
console.log(data);
return data + "Chained";
}
function allSuccess(){
console.log("ALL PROMISES RESOLVED")
}
one.promise.then(success).then(success);
two.promise.then(success);
three.promise.then(success).then(success).then(success);
$timeout(function () {
one.resolve("one done");
}, Math.random() * 1000);
$timeout(function () {
two.resolve("two done");
}, Math.random() * 1000);
$timeout(function () {
three.resolve("three done");
}, Math.random() * 1000);
});
В этом примере я настроил $q.all()
для обещаний один, два и три, которые будут разрешены в случайное время. Затем я добавляю обещания к концам первого и третьего. Я хочу, all
чтобы разрешился, когда все цепочки будут разрешены. Вот результат, когда я запускаю этот код:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
Есть ли способ дождаться разрешения цепей?
angularjs
promise
angular-promise
Дженсенгар
источник
источник
Q.all
выполнения - иначе это должно быть тривиально?$q.all
s, однако, как только я начну процесс разрешения, новые действия / обещания не будут связаны.Общепринятый ответ является правильным. Я хотел бы привести пример, чтобы немного прояснить его для тех, кто не знаком с этим
promise
.Пример:
В моем примере мне нужно заменить
src
атрибутыimg
тегов другими зеркальными URL-адресами, если они доступны, до рендеринга контента.Пояснение:
Из документов AngularJS :
then
Метод:$ q.all (обещает)
Параметр
promises
может быть массивом обещаний.О программе
bind()
, подробнее здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindисточник
then
Метод$q.all
предусмотрен массив возвращенных обещаний, так что вы можете обходить этот массив и вызовthen
по отношению к каждому элементу массива, в отличие от вызова ,then
когда вы добавляете обещаниеpromise_array
.Недавно была эта проблема, но с неизвестным количеством обещаний. Решена с помощью jQuery.map () .
источник
Есть способ.
$q.all(...
Вы можете проверить следующие материалы:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
источник
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
правильно?Вы можете использовать «ожидание» в «асинхронной функции» .
ПРИМЕЧАНИЕ. Я не на 100% уверен, что вы можете вызвать асинхронную функцию из неасинхронной функции и получить правильные результаты.
Тем не менее, это никогда не будет использоваться на веб-сайте. Но для нагрузочного тестирования / интеграционного теста ... может быть.
Пример кода:
источник