Estou seguindo as especificações aqui e não tenho certeza se permite que onFulfilled seja chamado com vários argumentos.
Não, apenas o primeiro parâmetro será tratado como valor de resolução no construtor da promessa. Você pode resolver com um valor composto como um objeto ou matriz.
Não me importo com o modo como qualquer implementação específica de promessas faz isso, desejo seguir de perto as especificações do w3c.
É aí que eu acredito que você está errado. A especificação foi projetada para ser mínima e foi criada para interoperar entre bibliotecas de promessas. A idéia é ter um subconjunto que os futuros do DOM, por exemplo, possam usar com segurança e as bibliotecas possam consumir. As implementações promissoras fazem o que você pede .spread
há um tempo. Por exemplo:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Com Bluebird . Uma solução, se você deseja essa funcionalidade, é polifillá-la.
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);
});
};
}
Isso permite que você faça:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Com promessas nativas à vontade, brinque . Ou use propagação que é agora (2018) comum nos navegadores:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
Ou com aguardar:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);