Je suis la spécification ici et je ne sais pas si cela permet à onFulfilled d'être appelé avec plusieurs arguments.
Non, seul le premier paramètre sera traité comme valeur de résolution dans le constructeur de promesse. Vous pouvez résoudre avec une valeur composite comme un objet ou un tableau.
Je me fiche de la façon dont une mise en œuvre de promesses spécifiques le fait, je souhaite suivre de près les spécifications du w3c pour les promesses.
C'est là que je crois que vous vous trompez. La spécification est conçue pour être minimale et est conçue pour interopérer entre les bibliothèques de promesse. L'idée est d'avoir un sous-ensemble que les futurs DOM, par exemple, peuvent utiliser de manière fiable et que les bibliothèques peuvent consommer. Les implémentations Promise font ce que vous demandez .spread
depuis un moment maintenant. Par exemple:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Avec Bluebird . Une solution si vous voulez cette fonctionnalité est de la polyfill.
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);
});
};
}
Cela vous permet de faire:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Avec les promesses natives à l'aise violon . Ou utilisez la diffusion qui est maintenant (2018) courante dans les navigateurs:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
Ou avec wait:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);