Heim >Web-Frontend >js-Tutorial >Detailliertes Verständnis der js-Promise-Chain_Javascript-Techniken

Detailliertes Verständnis der js-Promise-Chain_Javascript-Techniken

WBOY
WBOYOriginal
2016-05-16 15:02:041443Durchsuche

Der neue Standard fügt natives Promise hinzu.

Hier besprechen wir nur die Verwendung von Ketten und denken über die Details nach.

1. Überprüfung von then() und Catch()

Die Callback-Funktion kann in den Parametern von then() und Catch() platziert werden, um das Endergebnis eines Promise zu erhalten.

then() kann einen Parameter empfangen, dann wird dieser Rückruf nur aufgerufen, wenn „resolve()“ versprochen wird.

then() kann auch einen zweiten Parameter empfangen, dann wird der zweite Rückruf verwendet, um die Promise-Reject()-Situation zu behandeln.

catch() behandelt speziell Promise-Reject()-Situationen.

Mit anderen Worten, then() kann in beide Richtungen verwendet werden und Catch() kann nur Reject()-Situationen verarbeiten. Es wird jedoch empfohlen, then() für die Verarbeitung vonsolve() und Catch() für die Verarbeitung vonject() zu verwenden.

Zweitens möchte ich jedoch nicht über das oben Genannte sprechen. Das Obige dient lediglich der Überprüfung der grundlegenden Verwendung. Hier beginnen wir, über die Rückgabewerte von then() und Catch() und die Details der Kettenverwendung zu sprechen.

Dann heißt es in der offiziellen Dokumentation, dass sowohl then() als auch Catch() ein Promise zurückgeben, was sehr faszinierend ist. (Ich bin neu in js und habe noch nie zuvor Versprechen in freier Wildbahn erlebt.)

Erstens ist dieses neu zurückgegebene Versprechen nicht das ursprüngliche Versprechen;

Zweitens hängt die Änderung des Status dieses neu zurückgegebenen Versprechens (sei es „resolve()“ oder „reject()“) mit dem Status des vorherigen Versprechens und der Art und Weise zusammen, wie then() verwendet wird.

Erklären Sie zunächst die Situation von then(): (ähnlich wie bei Catch)

var p1 = Promise.resolve("Success");
var p2 = p1.then(task1);
var p3 = p2.then(task2);
Hinweis: Die oben genannten Aufgaben 1 und 2 sind beide Rückrufe.

Hier ist p1 ein erstelltes Versprechen und direkt aufgelöst();

p2 ist ein Versprechen, das durch die Verwendung von then() erhalten wird, und p3 ist ebenfalls ein Versprechen, das durch die Verwendung von then() erhalten wird.

Wie ändert sich der Status von p2? Was ist mit p3?

Ich werde das folgende Bild verwenden, um dieses Konzept zu erklären:

Unter ihnen

1. Das Achteck stellt ein Promise-Objekt dar.

2. Der Kreis stellt den internen Zustand eines Versprechens dar und der schwarze Pfeil stellt Zustandsänderungen dar.

3. Der rechte Pfeil stellt den Aufruf der Then-Funktion dar.

4. Mit anderen Worten, solange die Funktion then aufgerufen wird, wird ein neues Promise-Objekt generiert.

5. Beim Aufruf der Then-Funktion weiß ich nicht, welchen Status das vorherige Promise-Objekt hat. Ist es ausstehend oder erledigt? Dies ist weder anzunehmen noch von außen erkennbar.

6. Der Aufruf der then-Funktion wird nicht blockiert, das heißt, p2 und p3 werden fast sofort generiert, auch wenn p1 noch langsam seinen eigenen Zustand migriert.

Wir wissen, dass der Status von p1 gelöst ist (siehe Code oben). Allerdings wurde hier nicht erklärt, wie sich der Status von p2 und p3 ändert. Wird er gelöst oder abgelehnt? Schauen Sie sich das neue Bild unten an.

Sie können weitere Diamantformen sehen.

Die Raute stellt die Rückruffunktion dar, die beim Aufruf von then übergeben wurde. Die nach oben gerichtete Raute stellt die eingehende Verarbeitung [für das vorherige Promise-Objekt, das aufgelöst wurde] dar, und die nach unten gerichtete Raute stellt die eingehende Verarbeitung [für das vorherige Promise-Objekt, das abgelehnt wurde] dar.

Hinweis: In diesem Beispiel gibt es keine Ablehnungsverarbeitung. Das heißt, die nach unten gerichtete Raute sollte hier der Einfachheit halber nicht gezeichnet werden ist für uns spezifisch. Wie man dann verwendet oder fängt. Schauen Sie sich noch einmal den Beispielcode an:

Wie Sie sehen, haben wir den zweiten Parameter damals nicht bereitgestellt, was bedeutet, dass wir die Ablehnungssituation nicht behandelt haben.

Wenn Sie außerdem Ausschuss verarbeiten möchten, können Sie „dann“ verwenden, oder Sie können „Catch“ verwenden, um den Ausschuss zu verarbeiten. Ansonsten gibt es keinen Unterschied.

1. Wenn der Endstatus von p1 (auflösen oder ablehnen) korrekt verarbeitet wird (wenn dann aufgerufen wird, wird der entsprechende Rückruf übergeben, d. h. es gibt eine entsprechende Raute), dann ändert sich der Status von p2 in „auflösen“. .

2. Wenn der Endstatus von p1 (Auflösen oder Ablehnen) nicht korrekt verarbeitet wird (wenn dann aufgerufen wird, fehlt der entsprechende Rückruf, dh es gibt keine entsprechende Raute), wird an den Status von p1 weitergeleitet p2 (erhält p1-Status).

3. Gib es so weiter.

4. In diesem Artikel wird nicht erklärt, wie man die endgültigen Daten des vorherigen Versprechens im Rückruf erhält, d. h. wie man die Daten überträgt. Dazu gibt es viele Tutorials.

Dritten: Im Folgenden werden einige Beispiele aufgeführt, um diesen Artikel zusammenzufassen.

Der Status von P1 im Bild ist angegeben, Lösung oder Ablehnung werden alle von Ihnen selbst angegeben. Ziel ist es, die Endzustände von P2 und P3 abzuleiten.

Die oben genannten sind vier unabhängige Beispiele ohne Zusammenhang zwischen ihnen.

X bedeutet, dass P3 die Funktion „Dann“ oder „Fang“ nicht verwendet, sodass es keine Möglichkeit gibt, mit „Auflösen“ oder „Ablehnen“ umzugehen.

Wenn es Fehler gibt, korrigieren Sie diese bitte rechtzeitig. Vielen Dank! ~! ! @~~~

Das obige detaillierte Verständnis der js-Versprechenskette ist der gesamte vom Herausgeber geteilte Inhalt. Ich hoffe, dass er Ihnen eine Referenz geben kann, und ich hoffe, dass Sie Script Home unterstützen.

Stellungnahme:
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