Sto seguendo le specifiche qui e non sono sicuro se consenta a onFulfilled di essere chiamato con più argomenti.
No, solo il primo parametro verrà trattato come valore di risoluzione nel costruttore della promessa. È possibile risolvere con un valore composito come un oggetto o un array.
Non mi interessa come fa una specifica implementazione delle promesse, desidero seguire da vicino le specifiche w3c per le promesse.
Ecco dove credo che tu abbia torto. Le specifiche sono progettate per essere minime e sono progettate per l'interoperabilità tra librerie promesse. L'idea è di avere un sottoinsieme che i futuri DOM possano ad esempio utilizzare in modo affidabile e che le librerie possano consumare. Le implementazioni promettenti fanno quello che chiedi.spread
un po 'di tempo. Per esempio:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Con Bluebird . Una soluzione se si desidera questa funzionalità è quella di polifillarla.
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);
});
};
}
Questo ti permette di fare:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Con promesse nativi a proprio agio violino . O usa spread che è ora (2018) banale nei browser:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
O con wait:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);