Heim > Web-Frontend > js-Tutorial > Wie kann ich bei der Verkettung von Versprechen in JavaScript auf frühere Ergebnisse zugreifen?

Wie kann ich bei der Verkettung von Versprechen in JavaScript auf frühere Ergebnisse zugreifen?

Susan Sarandon
Freigeben: 2024-11-28 10:04:12
Original
586 Leute haben es durchsucht

How to Access Previous Results When Chaining Promises in JavaScript?

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]);
});
Nach dem Login kopieren

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;
});
Nach dem Login kopieren

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;
});
Nach dem Login kopieren

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
        });
    });
})
Nach dem Login kopieren

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
});
Nach dem Login kopieren

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
});
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage