Wie Sie warten, Versprechen zu beenden, bevor die Funktion zurückkehrt
Grundlegende Versprechen Frage:
JS:
console.log('Promise START');
function makeFullJSON(time) {
return new Promise((resolve, reject) => {
setTimeout(resolve, time, [time]);
})
}
var p1 = makeFullJSON(1000);
var p2 = makeFullJSON(500);
var p3 = makeFullJSON(750);
p1.then(array => {
console.log('Promise 1 complete', array);
});
p2.then(array => {
console.log('Promise 2 complete', array);
});
p3.then(array => {
console.log('Promise 3 complete', array);
});
Promise.all([p1, p2, p3]).then(arrayOfAllResolvedValues => {
console.log('Array of resolved values:', arrayOfAllResolvedValues);
});
console.log('Promise END');
Den code Ausgabe:
Promise START
Promise END
Promise 2 complete [ 500 ]
Promise 3 complete [ 750 ]
Promise 1 complete [ 1000 ]
Array of resolved values: [ [ 1000 ], [ 500 ], [ 750 ] ]
Wie haben Sie den code umzuschreiben, so dass die Ausgabe lautet:
Promise START
Promise 2 complete [ 500 ]
Promise 3 complete [ 750 ]
Promise 1 complete [ 1000 ]
Array of resolved values: [ [ 1000 ], [ 500 ], [ 750 ] ]
Promise END
- klingt wie ein Duplikat von: stackoverflow.com/q/14220321/497418.
- Legen Sie einfach die Versprechen ENDE
console.log
neben den aufgelösten Werte ein? Promise.all([p1, p2, p3]).then(() => console.log('Promise END'))
- Sie können nicht immer die Ursache der interpreter in Javascript zu "warten" für jede asynchrone operation. Stattdessen, Sie tun, was Sie immer tun, in irgendeiner single-threaded event-driven Systems - Sie einen Rückruf registrieren, um benachrichtigt zu werden, wenn der Vorgang erledigt ist und Sie Ihre Arbeit durchzuführen in diesem callback. Sie nicht "warten" in Javascript.
- Vielen Dank an alle. Ich Stimme mit der Rückruf-Benachrichtigung. Das scheint der einzige Weg für jetzt (bis ich an die Verwendung async-await-pattern).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alles, was Sie wollen, zu geschehen, nachdem der Abschluss geht in die Pfeil-Funktion, die Sie passieren, um dann.
Um aufzugeben, unmittelbare Ausführung des Programms, und starten Sie das schreiben von code, das würde nur geschehen, nachdem alle 3 verspricht lösen ist, wie es klingt, wie Sie möchten passieren, dann würde ich empfehlen, eine neue Funktion, die direkt unterhalb Ihren code, um die code enthalten, die Sie möchten, zu geschehen, nachdem die Auflösung, und übergeben Sie die Funktion wie:
Promise.all([p1, p2, p3]).then(newFunctionName)
. Wäre es einfacher für Sie, um es auf diese Weise visualisieren, zumindest bis Sie sich daran gewöhnt, darüber nachzudenken, wie es arbeitet exakt.Zuerst beheben Sie den Syntaxfehler. Dann bewegen Sie die Konsole.log, wo der gesamte Prozess endet:
JS:
console.log('Promise 2 complete', array););
Wenn die offensichtliche Antwort der Platzierung der
console.log('Promise END')
nicht schweben Ihr Boot, warum nicht?Wenn Sie wollen, um die Sequenz einer operation, nachdem alle zusagen wurden erfüllt, die Sie haben, um die Sequenz mit
then()
genauso wie Sie tun, wenn Sie drucken Sie Ihre array-WerteVerwenden
async
/await
:JS:
Promise.all
?