Mam więc sytuację, w której mam wiele łańcuchów obietnic o nieznanej długości. Chcę, aby jakaś akcja została uruchomiona po przetworzeniu wszystkich ŁAŃCUCHÓW. Czy to w ogóle możliwe? Oto przykład:
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);
});
W tym przykładzie ustawiłem $q.all()
dla obietnic 1, 2 i 3, które zostaną rozwiązane w jakimś przypadkowym czasie. Następnie dodaję obietnice na końcach pierwszego i trzeciego. Chcę, all
aby rozwiązano, gdy wszystkie łańcuchy zostaną rozwiązane. Oto wynik po uruchomieniu tego kodu:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
Czy jest sposób, aby poczekać na rozwiązanie łańcuchów?
angularjs
promise
angular-promise
jensengar
źródło
źródło
Q.all
wykonaniu - w przeciwnym razie powinno to być trywialne?$q.all
, jednak gdy rozpocznę proces rozwiązywania problemów, żadne nowe działania / obietnice nie zostaną połączone.Odpowiedź akceptowana jest poprawna. Chciałbym podać przykład, aby rozwinąć go nieco tym, którzy nie są zaznajomieni
promise
.Przykład:
W moim przykładzie przed renderowaniem treści muszę zamienić
src
atrybutyimg
tagów na inne lustrzane adresy URL, jeśli są dostępne.Wyjaśnienie:
Z dokumentacji AngularJS :
then
Metoda:$ q.all (obietnice)
Parametr
promises
może być tablicą obietnic.Informacje
bind()
, więcej informacji tutaj: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindźródło
then
Metoda$q.all
jest tablicę zwróconych obietnic, więc można pętli że tablica i wezwaniethen
na każdej pozycji w tablicy, w przeciwieństwie do wywoływaniathen
podczas dodawania obietnicępromise_array
.Ostatnio miałem ten problem, ale z nieznaną liczbą obietnic. Rozwiązany za pomocą jQuery.map () .
źródło
Jest sposób.
$q.all(...
Możesz sprawdzić poniższe rzeczy:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
źródło
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
dobrze?Możesz użyć „await” w „funkcji asynchronicznej” .
UWAGA: Nie jestem w 100% pewien, czy możesz wywołać funkcję asynchroniczną z funkcji innej niż asynchroniczna i uzyskać właściwe wyniki.
To powiedziawszy, nigdy nie będzie używane w witrynie. Ale w przypadku testów obciążeniowych / testów integracji ... może.
Przykładowy kod:
źródło