Versprechen in Javascript vereinfachen
-
21-12-2019 - |
Frage
Sind die folgenden Codeausschnitte gleichwertig?
Version 1
function doSomething() {
var defer = $q.defer();
foo().then(function() {
bar().then(function() {
defer.resolve();
});
});
return defer.promise;
}
Version 2
function doSomething() {
return foo().then(bar);
}
Lösung
Es gibt viele Unterschiede zwischen diesen beiden Ansätzen.
Der Hauptunterschied zwischen den beiden Snippets besteht darin version 2
Sie übergeben implizit den aufgelösten Wert von foo
direkt zu bar
.Darüber hinaus doSomething
wird alles lösen bar
wird sich auflösen, während in version 1
das Ergebnis wird verworfen.
Einige weitere wichtige Punkte von Benjamin Grünbaum:
(a) Wenn Balken ein Referenzfehler ist, lehnt 1 das innere Versprechen und 2 Würfe ab.
(b) 1 erfordert einen Verweis auf $ Q, wobei 2 die Implementierung agnostisch ist.
(C) Version 1 ist nicht ausnahmesicher und eine Ablehnung wird geschluckt, bei der Version 2 Sie eine Ablehnung stellen lassen.;Es gibt auch mehrere kleinere Unterschiede.Siehe stackoverflow.com/questions/22539815
Man könnte es auch so schreiben.
Auf diese Weise erhalten Sie nicht die implizite Weitergabe des aufgelösten Werts von foo
Zu bar
(es ist jetzt explizit), was verwirrend sein oder leicht übersehen werden kann.Es kann auch nützlich sein, wenn Sie etwas mit den aufgelösten Werten von tun möchten foo
oder bar
bevor Sie sie zurückgeben.
function doSomething() {
return foo().then(function(res){
// maybe do something with the result of foo
return bar(res);
}).then(function(res){
// maybe do something with the result of bar
return res;
});
}
Das manuelle Erstellen eines zurückgestellten Objekts sollte auf ein Minimum beschränkt werden und ist im Allgemeinen ein Anti-Pattern.
https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern
Das hier demonstrierte Schlüsselprinzip besteht darin, dass ein Versprechen den Status des zurückgegebenen Versprechens (oder thenable ) innerhalb seiner Auflösungsmethode annimmt.