Bevor wir mit der formellen Einführung beginnen, möchten wir sehen, wie Javascript Promise aussieht:
var p = new Promise(function(resolve, ablehn) {
discover("hello world");
});
p. then(function(str ) {
alarm(str);
});
1
Was ist der Unterschied zwischen den folgenden beiden Codeteilen?
// Anlage A
var p = neues Versprechen (/*...*/);
p.then(func1);
p.then(func2);
// Anlage B
var p = neu Promise(/ *...*/);
p.then(func1)
.then(func2);
Wenn Sie die beiden oben genannten Codeteile ernst nehmen, dann ist Promises genau das Richtige ein eindimensionales Array von Rückruffunktionen. Dies ist jedoch nicht der Fall. Jeder then()-Aufruf gibt ein gespaltenes Versprechen zurück. Wenn daher in Anlage A func1() eine Ausnahme auslöst, wird func2() immer noch normal aufgerufen.
Wenn func1() in ExhibitB einen Fehler auslöst, wird fun2() nicht aufgerufen, da der erste Aufruf ein neues Versprechen zurückgibt, das in func1() abgelehnt wird. Das Ergebnis ist, dass func2() übersprungen wird.
Zusammenfassung: Versprechen können in mehrere Pfade aufgeteilt werden, ähnlich wie bei komplexen Flussdiagrammen.
2. Rückruf sollte das Ergebnis liefern
Welche Warnung erhalten Sie, wenn Sie den folgenden Code ausführen?
var p = new Promise(function(resolve , ablehnen) {
discover("hello world");
});
p.then(function(str) {})
.then(function(str) {
warning (str);
});
Der Alert im zweiten then() zeigt nichts an. Dies liegt daran, dass die Callback-Funktion im Kontext des Versprechens keine Callback-Funktion hat, da sich das Ergebnis ändert. Das Versprechen erwartet, dass Ihre Rückruffunktion dasselbe Ergebnis oder ein Ersatzergebnis zurückgibt, das dann an die nächste Rückruffunktion übergeben wird.
Verwenden Sie auf ähnliche Weise adpater, um die Ergebnisse wie folgt zu ändern:
var FeetToMetres = function(ft) { return ft*12*0.0254 };
var p = new Promise(/*...*/);
p .then(feetToMetres)
.then(function(meters) {
warning(meters);
});
3. Es können nur Ausnahmen aus der oberen Ebene abgefangen werden
Was ist der Unterschied zwischen diesen beiden Codeteilen?
// Anlage A
neues Versprechen (Funktion( auflösen, ablehnen) {
auflösen("hello world");
})
.then(
function(str) {
throw new Error("uh oh") ;
},
undefiniert
)
.then(
undefiniert,
function(error) {
warning(error);
}
);
// Anlage B
neues Versprechen(funktion(auflösen, ablehnen) {
auflösen("Hallo Welt");
})
.then(
Funktion(str) {
throw new Error("uh oh");
},
function(error) {
warning(error);
}
);
in Im ersten Teil des Codes wird die im ersten then() ausgelöste Ausnahme vom zweiten then() abgefangen und dann die „uh oh“-Warnung ausgelöst. Daraus folgt, dass nur Ausnahmen der vorherigen Ebene abgefangen werden.
Im zweiten Teil des Codes befinden sich die Rückruffunktion und die Fehlerrückruffunktion auf derselben Ebene, was bedeutet, dass eine im Rückruf ausgelöste Ausnahme nicht abgefangen wird. Tatsächlich wird der Fehlerrückruf im zweiten Code nur ausgelöst, wenn das Versprechen abgelehnt wird oder das Versprechen selbst fehlschlägt
4. Fehler können behoben werden
Wenn Sie in einer Fehlerrückruffunktion den Fehler nicht erneut auslösen, geht das Versprechen davon aus, dass Sie den Fehler behoben haben, und kehrt zum gelösten Zustand zurück. Im nächsten Beispiel wird „ich bin gerettet“ angezeigt, da der Fehlerrückruf im ersten then() die Ausnahme nicht erneut ausgelöst hat.
Code kopieren Der Code lautet wie folgt:
var p = new Promise(function(resolve, ablehn) {
reject(new Error("pebkac"));
});
p.then(
undefiniert,
function(error) { }
)
.then(
function(str) {
warning("Ich bin gerettet!");
},
function(error) {
warning("Bad computer!");
}
);
Promise kann man sich wie Schichten auf einer Zwiebel vorstellen. Jedes then() fügt der Zwiebel eine weitere Schicht hinzu. Jede Ebene stellt eine Aktivität dar, die verarbeitet wird. Wenn eine Schicht endet, gilt das Ergebnis als repariert und bereit für die nächste Schicht.
5. Versprechen können pausiert werden
Nur weil Sie bereit sind, eine then()-Methode auszuführen, heißt das nicht, dass Sie nicht pausieren und andere vorzeitig ausführen können. Um das aktuelle Versprechen anzuhalten oder auf den Abschluss eines anderen Versprechens warten zu lassen, geben Sie einfach ein weiteres Versprechen in then() zurück.
var p = new Promise(/*. ..* /);
p.then(function(str) {
if(!loggedIn) {
return new Promise(/*...*/);
}
})
.then(function(str) {
warning("Done.");
})
Im vorherigen Code wird die Eingabeaufforderung erst angezeigt Neues Versprechen ist gelöst. Dies ist eine praktische Möglichkeit, mehr Abhängigkeiten in einen vorhandenen asynchronen Codepfad einzuführen. Beispielsweise stellen Sie möglicherweise fest, dass die Sitzung des Benutzers abgelaufen ist, und Sie möchten möglicherweise eine zweite Anmeldung initialisieren, bevor Sie mit dem vorherigen Codepfad fortfahren.
6. Aufgelöste Versprechen werden nicht sofort ausgeführt
Erhalte ich eine Eingabeaufforderung, wenn ich den folgenden Code ausführe?
function runme() {
var i = 0 ;
new Promise(function(resolve) {
discover();
})
.then(function() {
i = 2;
});
warning(i);
}
Da das Promise sofort aufgelöst wird und die then()-Methode sofort ausgeführt wird, könnte man meinen, dass Prompt 2 erkannt wird. Die Versprechensdefinition erfordert jedoch, dass alle Aufrufe asynchron erzwungen werden. Daher wird die Eingabeaufforderung vor der Änderung generiert.