Então, eu tenho uma situação em que tenho várias cadeias de promessa de comprimento desconhecido. Quero que alguma ação seja executada quando todos os CHAINS tiverem sido processados. É mesmo possível? Aqui está um exemplo:
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);
});
Neste exemplo, configurei um $q.all()
para as promessas um, dois e três que serão resolvidas em algum momento aleatório. Em seguida, adiciono promessas às pontas de um e três. Eu quero all
resolver quando todas as cadeias forem resolvidas. Aqui está a saída quando executo este código:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
Existe uma maneira de esperar que as cadeias sejam resolvidas?
angularjs
promise
angular-promise
Jensengar
fonte
fonte
Q.all
executada - caso contrário, deve ser trivial?$q.all
s, no entanto, quando eu iniciar o processo de resolução, nenhuma nova ação / promessa será encadeada.A resposta aceita está correta. Gostaria de dar um exemplo para elaborá-lo um pouco para quem não está familiarizado
promise
.Exemplo:
No meu exemplo, preciso substituir os
src
atributos dasimg
tags por diferentes URLs de espelho, se disponíveis, antes de renderizar o conteúdo.Explicação:
Dos documentos AngularJS :
O
then
método:$ q.all (promessas)
O
promises
param pode ser uma série de promessas.Sobre
bind()
, mais informações aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindfonte
then
método de$q.all
é fornecido uma matriz das promessas retornadas, de modo que você pode fazer um loop nessa matriz e chamarthen
cada item na matriz, em vez de chamarthen
quando adiciona a promessa apromise_array
.Recentemente tive esse problema, mas com um número desconhecido de promessas. Resolvido usando jQuery.map () .
fonte
Há uma maneira.
$q.all(...
Você pode verificar os itens abaixo:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
fonte
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
certo?Você pode usar "await" em uma "função assíncrona" .
NOTA: Não tenho 100% de certeza de que você pode chamar uma função assíncrona de uma função não assíncrona e obter os resultados corretos.
Dito isto, isso nunca seria usado em um site. Mas para teste de carga / teste de integração ... talvez.
Código de exemplo:
fonte