Я следую спецификации здесь и не уверен, позволяет ли она вызывать onFulfilled с несколькими аргументами.
Нет, только первый параметр будет рассматриваться как значение разрешения в конструкторе промисов. Вы можете разрешить составное значение, такое как объект или массив.
Меня не волнует, как это делает какая-либо конкретная реализация обещаний, я хочу внимательно следить за спецификацией 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);
});
С нативными промисами легко fiddle. Или используйте спред, который сейчас (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