Ich verwende Bluebird und sehe zwei Möglichkeiten, um synchrone Funktionen in ein Versprechen aufzulösen, aber ich verstehe die Unterschiede zwischen beiden Möglichkeiten nicht. Es sieht so aus, als ob der Stacktrace ein bisschen anders ist, also sind sie nicht nur ein alias
, oder?
Was ist der bevorzugte Weg?
Weg A.
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
Weg B.
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
javascript
promise
bluebird
Pipo
quelle
quelle
Promise.resolve
ist nur Zucker.Antworten:
Im Gegensatz zu beiden Antworten in den Kommentaren gibt es einen Unterschied.
Während
ist im Grunde das gleiche wie
es gibt eine Subtilität.
Versprechende Rückgabefunktionen sollten im Allgemeinen die Garantie haben, dass sie nicht synchron ausgelöst werden, da sie möglicherweise asynchron ausgelöst werden. Um unerwartete Ergebnisse und Rennbedingungen zu vermeiden, werden Würfe normalerweise in zurückgegebene Ablehnungen umgewandelt.
In diesem Sinne ist der Versprechen-Konstruktor bei der Erstellung der Spezifikation sicher.
Was passiert , wenn
someObject
istundefined
?Bluebird hat dies
Promise.method
erkannt und Petka hat hinzugefügt , um dieses Problem zu beheben, damit Sie weiterhin Rückgabewerte verwenden können. Der richtige und einfachste Weg, dies in Bluebird zu schreiben, ist eigentlich keiner - es ist:Promise.method konvertiert Würfe in Ablehnungen und kehrt für Sie in Auflösungen zurück. Es ist der sicherste Weg, dies zu tun, und es assimiliert
then
Fähigkeiten durch Rückgabewerte, so dass es funktionieren würde, selbst wennsomeObject
es tatsächlich ein Versprechen selbst ist.Promise.resolve
Wird im Allgemeinen verwendet, um Objekte und ausländische Versprechen (thenables) in Versprechen umzuwandeln. Das ist der Anwendungsfall.quelle
Promise.resolve()
ein Anti-Pattern ist?Promise.resolve()
eine neue InstanzPromise
auf die gleiche Weise wie mitnew
? Wenn nicht,return Promise.resolve(yourCode)
wäre schneller und vermeiden Sie synchrone Würfe.Promise.coroutine
was noch nützlicher ist.Es gibt einen weiteren Unterschied, der in den obigen Antworten oder Kommentaren nicht erwähnt wird:
Wenn
someObject
ist einPromise
,new Promise(resolve)
würde zwei zusätzliche Tick kosten.Vergleichen Sie zwei folgende Codeausschnitte:
Das zweite Snippet würde zuerst "Tick 3" drucken. Warum?
Wenn der Wert ein Versprechen ist,
Promise.resolve(value)
würde er den Wert genau zurückgeben.Promise.resolve(value) === value
wäre wahr. siehe MDNAber
new Promise(resolve => resolve(value))
würde ein neues Versprechen zurück , die in gesperrt hat die folgenvalue
Versprechen. Es wird ein zusätzliches Häkchen benötigt, um das "Einrasten" durchzuführen.Der
tick 1
.then
Anruf würde zuerst ausgeführt.Verweise:
quelle