Bevor wir mit der formellen Einführung beginnen, möchten wir sehen, wie JavaScript -Versprechen aussieht:
Die Codekopie lautet wie folgt:
var p = New Promise (Funktion (Auflösung, Ablehnung) {
Entschlossen ("Hallo Welt");
});
p.then (Funktion (str) {
Alarm (str);
});
1. Dann () kehrt ein Forked -Versprechen zurück
Was ist der Unterschied zwischen den folgenden zwei Codes?
Die Codekopie lautet wie folgt:
// Ausstellung a
var p = neues Versprechen (/*...*/);
p.then (func1);
p.then (func2);
// Ausstellung b
var p = neues Versprechen (/*...*/);
p.then (func1)
.then (func2);
Wenn Sie die oben genannten zwei Teile des Codesäquivalents sorgfältig berücksichtigen, sind Versprechen nur ein eindimensionales Array von Rückruffunktionen. Dies ist jedoch nicht der Fall. Jede dann () Anruf gibt ein gabelhaftes Versprechen zurück. Daher wird Func2 () in Exhibita, wenn func1 () eine Ausnahme ausführt, immer noch normal.
Wenn Func1 () einen Fehler auslöst, wird Fun2 () nicht aufgerufen, da der erste Anruf ein neues Versprechen zurückgibt, das in Func1 () abgelehnt wird. Das Ergebnis ist, dass func2 () übersprungen wird.
Zusammenfassung: Versprechen können in mehrere Pfade gabelisch sein, ähnlich wie komplexe Flussdiagramme.
2. Rückruf sollte das Ergebnis übergeben
Was wird eine Warnung bekommen, wenn Sie den folgenden Code ausführen?
Die Codekopie lautet wie folgt:
var p = New Promise (Funktion (Auflösung, Ablehnung) {
Entschlossen ("Hallo Welt");
});
p.then (Funktion (str) {})
.then (Funktion (str) {
Alarm (str);
});
Die Warnung im zweiten () zeigt nichts. Dies liegt daran, dass die Rückruffunktion im Kontext des Versprechens keine Rückruffunktion gibt, da sich das Ergebnis ändert. Promise erwartet, dass Ihr Rückruf das gleiche Ergebnis oder ein Ersatzergebnis zurückgibt, das dann an den nächsten Rückruf übergeben wird.
Ähnlich wie bei der Verwendung von Adpater zur Änderung der Ergebnisse wie folgt:
Die Codekopie lautet wie folgt:
var feettometres = function (ft) {return ft*12*0,0254};
var p = neues Versprechen (/*...*/);
P.then (Feettometern)
.then (Funktion (Meter) {
Alarm (Meter);
});
3.. Nur Ausnahmen von der vorherigen Schicht können gefangen werden
Was ist der Unterschied zwischen diesen beiden Codestücken?
Die Codekopie lautet wie folgt:
// Ausstellung a
Neues Versprechen (Funktion (Resolve, Ablehnung) {
Entschlossen ("Hallo Welt");
})
.Dann(
Funktion (str) {
Neuen Fehler werfen ("uh oh");
},
undefiniert
)
.Dann(
undefiniert,
Funktion (Fehler) {
alarm (Fehler);
}
);
// Ausstellung b
Neues Versprechen (Funktion (Resolve, Ablehnung) {
Entschlossen ("Hallo Welt");
})
.Dann(
Funktion (str) {
Neuen Fehler werfen ("uh oh");
},
Funktion (Fehler) {
alarm (Fehler);
}
);
Im ersten Code wird die Ausnahme in der ersten dann () geworfen und vom zweiten () gefangen, und die Warnung "uh oh" wird ausgelöst. Diese Anleitung wird nur Ausnahmen auf der vorherigen Ebene erfasst.
Im zweiten Code befinden sich die Rückruffunktion und die Fehlerrückruffunktion auf derselben Ebene, was bedeutet, dass eine Ausnahme in den Rückruf nicht gefangen wird. Tatsächlich wird der Fehlerrückruf des zweiten Code nur dann geworfen, wenn das Versprechen abgelehnt wird oder wenn das Versprechen selbst falsch ist.
4.. Fehler können wiederhergestellt werden
In einer Fehlerrückruffunktion geht das Versprechen davon aus, dass Sie sich aus dem Fehler wiederhergestellt und in einen aufgelösten Zustand invertiert haben. Im nächsten Beispiel wird "Ich bin gespeichert" angezeigt, da der Fehlerrückruf im ersten Fall () die Ausnahme nicht wieder durchdrungen hat.
Die Codekopie lautet wie folgt:
var p = New Promise (Funktion (Auflösung, Ablehnung) {
ablehnen (neuer Fehler ("pebkac"));
});
p.then (
undefiniert,
Funktion (Fehler) {}
)
.Dann(
Funktion (str) {
Alarm ("Ich bin gerettet!");
},
Funktion (Fehler) {
Alarm ("schlechter Computer!");
}
);
Versprechen kann als Schicht auf einer Zwiebel gesehen werden. Jede dann () fügt der Zwiebel eine weitere Ebene hinzu. Jede Ebene repräsentiert eine verarbeitete Aktivität. Wenn die Hierarchie beendet ist, wird angenommen, dass das Ergebnis für die nächste Hierarchie festgelegt und bereit ist.
5. Versprechen können suspendiert werden
Da Sie bereit sind, in einer dann () Methode auszuführen, bedeutet dies nicht, dass Sie nicht im Voraus pausieren und andere ausführen können. Um das aktuelle Versprechen zu pausieren oder auf ein anderes Versprechen warten zu lassen, geben Sie einfach ein anderes Versprechen zurück ().
Die Codekopie lautet wie folgt:
var p = neues Versprechen (/*...*/);
p.then (Funktion (str) {
if (! loggedin) {
Neues Versprechen zurückgeben (/*...*/);
}
})
.then (Funktion (str) {
alarm ("fertig.");
})
Im vorherigen Code erscheint die Eingabeaufforderung erst, wenn das neue Versprechen analysiert wird. Dies ist eine bequeme Möglichkeit, um mehr Abhängigkeiten in den vorhandenen asynchronen Codungsweg einzuführen. Sie können beispielsweise feststellen, dass die Benutzersitzung Zeitlimit hat und Sie möglicherweise die zweite Anmeldung initialisieren möchten, bevor Sie den vorherigen Codepfad fortsetzen.
6. Aufgelöste Versprechen werden nicht sofort ausgeführt
Erhalten Sie beim Ausführen des folgenden Codes ein Eingabeaufforderungsteil?
Die Codekopie lautet wie folgt:
Funktion Runme () {
var i = 0;
neues Versprechen (Funktion (Resolve) {
lösen();
})
.then (function () {
i += 2;
});
Alarm (i);
}
Da Promise sofort analysiert wird und dann () die Methode sofort ausgeführt wird, denken Sie möglicherweise, dass forderungs 2 untersucht wird. Die Versprechensdefinition erfordert jedoch, dass alle Anrufe asynchron erzwungen werden. Daher wird die Eingabeaufforderung erzeugt, bevor sie geändert wird.