Следвам спецификацията тук и не съм сигурен дали позволява onFulfilled да бъде извикан с множество аргументи.
Не, само първият параметър ще се третира като стойност на резолюцията в конструктора на обещанието. Можете да разрешите със съставна стойност като обект или масив.
Не ме интересува как го прави някаква конкретна реализация на обещания, искам да следвам отблизо спецификацията на w3c за обещания.
Тук вярвам, че грешите. Спецификацията е разработена да бъде минимална и е създадена за взаимодействие между библиотеки за обещания. Идеята е да има подмножество, което фючърсите на DOM например могат надеждно да използват и библиотеките да консумират. Реализациите на Promise правят това, което поискате с .spread
за известно време. Например:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
С Bluebird. Едно решение, ако искате тази функционалност, е да я попълните.
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);
});
};
}
Това ви позволява да правите:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
С естествени обещания на спокойствие цигулка. Или използвайте разпространение, което сега (2018 г.) е обичайно в браузърите:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
Или с чакане:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);
person
Benjamin Gruenbaum
schedule
01.04.2014