Ich folge hier der Spezifikation und bin mir nicht sicher, ob onFulfilled mit mehreren Argumenten aufgerufen werden kann. Beispielsweise:
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
so dass mein Code:
promise.then(function(arg1, arg2){
// ....
});
würde beides erhalten arg1
und arg2
?
Es ist mir egal, wie eine bestimmte Versprechen-Implementierung funktioniert, ich möchte die w3c-Spezifikation für Versprechen genau befolgen.
javascript
promise
Badunk
quelle
quelle
Antworten:
Nein, nur der erste Parameter wird im Versprechen-Konstruktor als Auflösungswert behandelt. Sie können mit einem zusammengesetzten Wert wie einem Objekt oder Array auflösen.
Da glaube ich, dass du falsch liegst. Die Spezifikation ist minimal ausgelegt und für die Zusammenarbeit zwischen Versprechensbibliotheken konzipiert. Die Idee ist, eine Teilmenge zu haben, die DOM-Futures beispielsweise zuverlässig nutzen und Bibliotheken nutzen können. Vielversprechende Implementierungen machen das, womit Sie schon seit einiger Zeit fragen
.spread
. Beispielsweise:Mit Bluebird . Eine Lösung, wenn Sie diese Funktionalität wünschen, besteht darin, sie zu füllen.
So können Sie Folgendes tun:
Mit einheimischen Versprechungen beruhigen Geige . Oder verwenden Sie Spread, der heute (2018) in Browsern üblich ist:
Oder mit warten:
quelle
.spread
Bluebird unterstützen - der Grund, warum es nicht in der Spezifikation enthalten ist, ist, dass es wirklich eine große Sache ist, die Spezifikation minimal zu halten , um eine Interop zwischen Code und Bibliotheken zu ermöglichen.Promise.all
das Array aufrufen, bevor Sie die Funktion anwenden, anstatt sie nur.then
für einige Zuckerbibliotheken zu verwenden. Es ist nicht obligatorisch, aber es ist süß.return Promise.all(args).then(function(args){return fn.apply(this, args);})
spread
ist eine Notlösung. ES6 führt die Destrukturierung und den Rest / Spread-Operator ein, wodurch die Notwendigkeit einerspread
direkten Beseitigung entfällt ..then(([a, b, c]) => {})
Sie können die E6-Destrukturierung verwenden:
Objektzerstörung:
Array-Destrukturierung:
quelle
Der Erfüllungswert eines Versprechens entspricht dem Rückgabewert einer Funktion, und der Ablehnungsgrund eines Versprechens entspricht der ausgelösten Ausnahme einer Funktion. Funktionen können nicht mehrere Werte zurückgeben, daher dürfen Versprechen nicht mehr als einen Erfüllungswert haben.
quelle
Soweit ich das Lesen der ES6-Versprechen-Spezifikation und der Standard-Versprechen-Spezifikation beurteilen kann, gibt es keine Klausel, die eine Implementierung daran hindert, diesen Fall zu behandeln - sie ist jedoch nicht in den folgenden Bibliotheken implementiert:
Ich gehe davon aus, dass der Grund dafür, dass sie Multi-Arg-Auflösungen weglassen, darin besteht, die Reihenfolge der Änderungen prägnanter zu gestalten (dh da Sie nur einen Wert in einer Funktion zurückgeben können, würde dies den Steuerungsfluss weniger intuitiv machen). Beispiel:
quelle
return Promise.of(x, y)
anstelle eines skalaren Wertes aus demthen
Rückruf.Hier ist eine CoffeeScript-Lösung.
Ich suchte nach der gleichen Lösung und fand etwas sehr Interessantes an dieser Antwort: Ablehnen von Versprechungen mit mehreren Argumenten (wie $ http) in AngularJS
die Antwort dieses Typen Florian
Und um es zu benutzen:
quelle
->
sein=>
?Tolle Frage und tolle Antwort von Benjamin, Kris ua - vielen Dank!
Ich verwende dies in einem Projekt und habe ein Modul erstellt, das auf dem Code von Benjamin Gruenwald basiert . Es ist auf npmjs verfügbar:
Dann tun Sie es in Ihrem Code
Wenn Sie eine Bibliothek wie verwenden
any-promise
Vielleicht finden das auch andere nützlich!
quelle
Eine De-Strukturierung der Zuweisung in ES6 würde hier helfen. Zum Beispiel:
quelle
Da Funktionen in Javascript mit einer beliebigen Anzahl von Argumenten aufgerufen werden können und das Dokument
onFulfilled()
die Argumente der Methode neben der folgenden Klausel nicht einschränkt , können Sie meiner Meinung nach mehrere Argumente an dieonFulfilled()
Methode übergeben, solange der Wert des Versprechens der ist erstes Argument.quelle
Um den folgenden Artikel zu zitieren, benötigt "" dann "zwei Argumente, einen Rückruf für einen Erfolgsfall und ein weiteres für den Fehlerfall. Beide sind optional, sodass Sie einen Rückruf nur für den Erfolgs- oder Fehlerfall hinzufügen können."
Normalerweise schaue ich auf dieser Seite nach grundlegenden Versprechungsfragen. Lassen Sie mich wissen, wenn ich falsch liege
http://www.html5rocks.com/de/tutorials/es6/promises/
quelle
new Promise
hat die Syntax,function(resolve, error)
währendthen
die Syntax.then(function(arg) {
.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})