Я слідую за специфікацією тут і не впевнений, чи дозволяє він виклик onFulf ispun з кількома аргументами.
Ні, просто перший параметр буде розглянуто як значення роздільної здатності в конструкторі обіцянок. Ви можете вирішити складене значення, наприклад об'єкт або масив.
Мене не цікавить, як це виконує будь-яка конкретна обіцянка, я хочу уважно стежити за специфікацією w3c за обіцянками.
Ось де я вважаю, що ви помиляєтесь. Специфікація розрахована на мінімальний рівень і побудована для взаємодії між бібліотеками обіцянок. Ідея полягає у тому, щоб мати підмножину, яку, наприклад, ф'ючерси DOM, можуть надійно використовувати та бібліотеки можуть споживати. Обіцяючі впровадження роблять те, про що ви просите, .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', '!']);