Postępuję zgodnie ze specyfikacją tutaj i nie jestem pewien, czy pozwala ona na wywołanie onFulfilled z wieloma argumentami.
Nie, tylko pierwszy parametr będzie traktowany jako wartość rozdzielczości w konstruktorze obietnicy. Możesz rozwiązać za pomocą wartości złożonej, takiej jak obiekt lub tablica.
Nie obchodzi mnie, jak robi to jakakolwiek konkretna realizacja obietnic, chciałbym ściśle przestrzegać specyfikacji w3c dotyczących obietnic.
Myślę, że właśnie tam się mylisz. Specyfikacja została zaprojektowana jako minimalna i została stworzona do współdziałania między bibliotekami obietnic. Chodzi o to, aby mieć podzbiór, który na przykład DOM futures może niezawodnie wykorzystywać, a biblioteki mogą wykorzystywać. Implementacje Promise .spread
od jakiegoś czasu robią to, o co prosisz . Na przykład:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Z Bluebird . Jednym z rozwiązań, jeśli chcesz mieć tę funkcjonalność, jest wypełnienie jej.
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);
});
};
}
Dzięki temu możesz:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Z rodzimymi obietnicami swobodnie bawią się . Lub użyj spreadu, który jest teraz (2018) powszechny w przeglądarkach:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
Lub z oczekiwaniem:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);