Ich folge hier der Spezifikation und bin mir nicht sicher, ob onFulfilled mit mehreren Argumenten aufgerufen werden kann.
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.
Es ist mir egal, wie eine bestimmte Versprechen-Implementierung funktioniert, ich möchte die w3c-Spezifikation für Versprechen genau befolgen.
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:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Mit Bluebird . Eine Lösung, wenn Sie diese Funktionalität wünschen, besteht darin, sie zu füllen.
if (!Promise.prototype.spread) {
Promise.prototype.spread = function (fn) {
return this.then(function (args) {
return Promise.all(args); // wait for all
}).then(function(args){
//this is always undefined in A+ complaint, but just in case
return fn.apply(this, args);
});
};
}
So können Sie Folgendes tun:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Mit einheimischen Versprechungen beruhigen Geige . Oder verwenden Sie Spread, der heute (2018) in Browsern üblich ist:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
Oder mit warten:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);