Versprechen verketten und frühere Ergebnisse teilen
In diesem Szenario müssen Sie eine Reihe von HTTP-Anfragen stellen und Antwortdaten von einer Anfrage weitergeben zum nächsten mit Bluebird's Promise.join. Die Herausforderung besteht darin, auf die Antwortdaten der ersten Anfrage zuzugreifen.
Um dies zu erreichen, können Sie einen von mehreren Ansätzen verwenden:
Option 1: Ergebnis von Eins an das Nächste weitergeben
Bei diesem Ansatz werden Versprechen direkt verkettet und das Ergebnis einer Anfrage als Eingabe an die nächste weitergegeben. Jeder nachfolgende .then()-Handler hat nur Zugriff auf das neueste Ergebnis:
Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(first, second, third) { console.log([first, second, third]); });
Dieser Ansatz ermöglicht jedoch keinen Zugriff auf frühere Ergebnisse.
Option 2: Zuweisen Zwischenergebnisse zu höherem Geltungsbereich
Hier weisen Sie Zwischenergebnisse Variablen zu, die in einem höheren Geltungsbereich deklariert sind. Dies ermöglicht den Zugriff auf alle vorherigen Ergebnisse in nachfolgenden .then()-Handlern:
var r1, r2, r3; Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1, result2, result3) { r1 = result1; r2 = result2; r3 = result3; });
Option 3: Ergebnisse in einem Objekt akkumulieren
Dieser Ansatz beinhaltet die Erstellung eines Objekts um Ergebnisse zu sammeln, sobald sie verfügbar sind. Jeder .then()-Handler fügt sein Ergebnis dem Objekt hinzu und ermöglicht so den Zugriff auf alle vorherigen Ergebnisse:
var results = {}; Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1, result2, result3) { results.result1 = result1; results.result2 = result2; results.result3 = result3; });
Option 4: Versprechen verschachteln
Das Verschachteln von Versprechen ermöglicht Ihnen um auf alle vorherigen Ergebnisse innerhalb der verschachtelten Bereiche zuzugreifen:
Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result1) { // result1 is available here return Promise.join( callhttp("172.16.28.200", payload), callhttp("172.16.28.200", payload) ).then(function(result2) { // result1 and result2 are available here return Promise.join( callhttp("172.16.28.200", payload) ).then(function(result3) { // result1, result2 and result3 are available here }); }); })
Option 5: Unterbrechen Sie die Kette in „Unabhängig“. Teile
Wenn einige Teile der Kette unabhängig voneinander ausgeführt werden können, können Sie die Kette unterbrechen, sie separat starten und Promise.all() verwenden, um die Ergebnisse zu sammeln:
var p1 = callhttp("172.16.28.200", payload); var p2 = callhttp("172.16.28.200", payload).then(function(result2) { return someAsync(result2); }).then(function(result2a) { return someOtherAsync(result2a); }); var p3 = callhttp("172.16.28.200", payload).then(function(result3) { return someAsync(result3); }); Promise.all([p1, p2, p3]).then(function(results) { // multiple results available in results array // that can be processed further here with // other promises });
Option 6: Sequenz mit Warten in ES7
Promises bieten eine Möglichkeit, asynchrone Vorgänge zu sequenzieren. In ES7 können Sie „await“ verwenden, um diese Vorgänge zu sequenzieren und so den Prozess zu vereinfachen:
async function someFunction() { const r1 = await callhttp("172.16.28.200", payload); // can use r1 here to formulate second http call const r2 = await callhttp("172.16.28.200", payload); // can use r1 and r2 here to formulate third http call const r3 = await callhttp("172.16.28.200", payload); // do some computation that has access to r1, r2 and r3 return someResult; } someFunction().then(result => { // process final result here }).catch(err => { // handle error here });
Beachten Sie, dass jede Option ihre eigenen Vor- und Nachteile hat. Wählen Sie diejenige aus, die den spezifischen Anforderungen Ihrer Anwendung am besten entspricht.
Das obige ist der detaillierte Inhalt vonWie kann ich bei der Verkettung von Versprechen in JavaScript auf frühere Ergebnisse zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!