Estoy siguiendo la especificación aquí y no estoy seguro de si permite llamar a onFulfilled con múltiples argumentos.
No, solo el primer parámetro será tratado como valor de resolución en el constructor de promesa. Puede resolver con un valor compuesto como un objeto o matriz.
No me importa cómo lo hace una implementación de promesas específicas, deseo seguir de cerca la especificación w3c para promesas.
Ahí es donde creo que te equivocas. La especificación está diseñada para ser mínima y está diseñada para interoperar entre bibliotecas prometedoras. La idea es tener un subconjunto que los futuros de DOM, por ejemplo, puedan usar de manera confiable y las bibliotecas puedan consumir. Las implementaciones prometedoras hacen lo que pides .spread
por un tiempo ahora. Por ejemplo:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Con Bluebird . Una solución si desea esta funcionalidad es rellenarla.
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);
});
};
}
Esto te permite hacer:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Con promesas nativas a gusto violín . O use spread, que ahora es (2018) común en los navegadores:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
O con esperar:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);