Was ist der Unterschied zwischen Rückgabe-Wert oder Versprechen.beheben von da()
Was ist der Unterschied zwischen:
JS:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return "bbb";
})
.then(function(result) {
console.log(result);
});
und so:
JS:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return Promise.resolve("bbb");
})
.then(function(result) {
console.log(result);
});
Frage ich ja wie ich immer bin anders Verhalten, Mit Winkel-und $http-service mit Verkettung .dann(). Ein bisschen zu viel code damit ersten Beispiel oben.
- Was "anderes Verhalten" sehen Sie? Beide Beispiele funktionieren sollte, und Verhalten sich annähernd gleich. Die
Promise.resolve()
im zweiten Beispiel ist unnötig. - Es ist nichts falsch, überhaupt mit der Rückgabe ein Versprechen von einem
then
handler, in der Tat, es ist ein wichtiger Aspekt, der verspricht, spec, dass Sie tun können. - Hinweis: dies funktioniert mit beliebig verschachtelten
then
s - die 'andere Sprachen' Begriff HIERFÜR ist, dassthen
ist sowohl einmap
und einflatMap
. - in line 2, warum tun Sie müssen rufen res("aaa"), warum nicht zurückgeben können "aaa" ausreichend sein, und das Versprechen, fangen für die Lösung() in der gleichen Weise, dass es fängt Ausnahmen für reject() ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Regel ist, wenn die Funktion, die in der
then
handler gibt einen Wert zurück, der das Versprechen aufgelöst wird,/lehnt mit diesem Wert, und wenn die Funktion gibt ein Versprechen, was passiert ist, die nächstenthen
- Klausel werden diethen
Klausel das Versprechen der Funktion zurückgegeben, so dass in diesem Fall das erste Beispiel fällt durch die normale Abfolge derthens
" und druckt die Werte, wie man erwarten könnte, im zweiten Beispiel das promise-Objekt wird zurückgegeben, wenn SiePromise.resolve("bbb")
's dann ist diethen
dass wird aufgerufen, wenn die Verkettung(für alle Absichten und Zwecke). Die Art, wie es tatsächlich funktioniert, wird im folgenden ausführlich beschrieben.Zitat aus der Promises/A+ - Spezifikation:
Die wichtige Sache zu beachten hier ist diese Linie:
then
handler gibt ein Versprechen. +1 für die spec-Referenz.[[Resolve]]
heißt sowohl aufthen
ables-und-Werte, so dass im wesentlichen umschließt einen Wert mit dem Versprechen, soreturn "aaa"
ist das gleiche wiereturn Promise.resolve("aaa")
undreturn Promise.resolve("aaa")
ist das gleiche wiereturn Promise.resolve(Promise.resolve("aaa"))
- da lösen ist idempotent Berufung auf einen Wert, der mehr als einmal hat das gleiche Ergebnis."aaa"
undreturn Promise.resolve("aaa")
sind austauschbar inthen
rungen in allen Fällen?Beiden Beispiele Verhalten sich sehr ähnlich.
Einem zurückgegebenen Wert innerhalb eines
then()
- handler wird der dpi-Wert, der Verheißung zurückgekehrt aus, dassthen()
. Wenn der Wert wieder im inneren des.then
ist ein Versprechen, das Versprechen zurückgegebenthen()
wird "verabschieden, der Staat", dass Versprechen und beheben/ablehnen, so wie die zurückgegebenen Versprechen gilt.In deinem ersten Beispiel, Sie zurück
"bbb"
im erstenthen()
handler, so"bbb"
übergeben wird in der nächstenthen()
hf.In Ihrem zweiten Beispiel, kehren Sie ein Versprechen, das sofort behoben mit dem Wert
"bbb"
, so"bbb"
übergeben wird in der nächstenthen()
handler. (DiePromise.resolve()
hier ist eine zusätzliche).Das Ergebnis ist das gleiche.
Wenn Sie kann uns zeigen, ein Beispiel, dass tatsächlich weist das unterschiedliche Verhalten, können wir Ihnen sagen, warum das passiert ist.
Promise.resolve();
vsreturn;
?undefined
statt"bbb"
.In einfachen Worten, in einem
then
- handler-Funktion:A) Wenn
x
ist ein Wert (Zahl, string, etc):return x
entsprichtreturn Promise.resolve(x)
throw x
entsprichtreturn Promise.reject(x)
B) Wenn
x
ist ein Versprechen, das ist bereits erledigt (nicht mehr anhängig):return x
entsprichtreturn Promise.resolve(x)
, wenn das Versprechen war schon geklärt.return x
entsprichtreturn Promise.reject(x)
, wenn das Versprechen wurde bereits abgelehnt.C) Wenn
x
ist ein Versprechen, das noch aussteht:return x
zurück ausstehende Versprechen, und es wird ausgewertet, auf den nachfolgendenthen
.Lesen Sie mehr zu diesem Thema auf der Versprechen.der Prototyp.dann() docs.
Haben Sie schon eine gute formale Antwort. Ich dachte, ich sollte hinzufügen, eine kurze.
Folgende Dinge sind identisch mit Promises/A+ verspricht:
Promise.resolve
(In Ihrer Eckigen Gehäuse, das$q.when
)new $q
.then
Rückruf.Also die folgenden sind alle gleich für ein Versprechen oder nur-X-Wert:
Und es ist keine überraschung, die Versprechen, die Spezifikation ist auf der Grundlage der Versprechen Beschlussverfahren, die ermöglicht eine einfache Interoperabilität zwischen Bibliotheken (wie $q und einheimischen verspricht) und macht Ihr das Leben insgesamt leichter. Wann immer ein Versprechen-Auflösung auftreten, eine Auflösung tritt Schaffung von Kohärenz.