Wie Sie sich synchron, lösen eine Kette von es6 verspricht?
Habe ich eine Funktion aus einer Bibliothek, die eine Zusage zurückgibt. Ich muss zur Ausführung dieser Funktion mehrere Male, aber jeder iteration muss warten, bis der Vorherige Vorgang abgeschlossen ist.
Meine Vermutung war, dass ich dies tun könnte:
promiseReturner(1)
.then(promiseReturner(2)
.then(promiseReturner(3)
.then(...)
Könnte vereinfacht mit einer Schleife:
var p = Promise.resolve();
for (var i=1; i<=10; i++) {
p = p.then(promiseReturner(i));
}
Jedoch, wenn ich dies tun jedes Versprechen in der Kette ausgeführt wird, zur gleichen Zeit, anstatt eine nach der anderen als .then()
scheint zu implizieren. Klar fehlt mir etwas grundlegendes über das, was Sie Versprechen-aber nach der Lektüre einige tutorials und blog-posts ich bin immer noch verloren.
Hier ist ein codepen ich schrieb, um zu demonstrieren, dass mein Versuch.
- Tut
promiseReturner(n)
Gegenzug ein Versprechen oder eine Verheißung-Rückkehr-Funktion?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre "nicht-loop" - Lösung sollte nicht funktionieren. Sie haben, um einen Funktion zu
.then
, nicht ein Versprechen:Wenn, die Funktion gibt ein Versprechen, dann bekommen Sie, dass die Verkettung Wirkung.
Mehr Infos über verspricht auf MDN.
Kann vereinfacht werden, mit
let
(und die Pfeil-Funktionen):Oder
.bind
(das ist ES5):i
. Dieser ist fest mitlet
btw.promiseReturner
würde nicht brauchen einen parameter, die Sie tun könntenp = p.then(promiseReturner);
(beachten Sie, dass ich nicht den Aufruf der Funktion). Aber tatsächlich, es ist eine alternative zu den IIFE (sofort aufgerufen function expression), die.bind
:p = p.then(promiseReturner.bind(null, i));
.Wenn Sie mit es6, können Sie erreichen dies mit
array.reduce
. Ich denke ganz ordentlich.Können Sie
async/await
mit es6-Generatoren und eine Bibliothek, wie co.Hier einige detail, wie dies funktioniert: http://davidwalsh.name/async-generators
Hier ist eine Lösung, die ich verwendet, um dasselbe problem zu lösen:
Können Sie ausführen von code über nsynjs, pausiert die Ausführung jeder Funktion, die Renditen Versprechen, und warten Sie, bis das Versprechen aufgelöst wird:
JS:
HTML: