承诺可以在onFulfilled上有多个参数吗?

bad*_*unk 122 javascript promise

我在这里遵循规范,我不确定它是否允许使用多个参数调用onFulfilled.例如:

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled('arg1', 'arg2');
})
Run Code Online (Sandbox Code Playgroud)

这样我的代码:

promise.then(function(arg1, arg2){
    // ....
});
Run Code Online (Sandbox Code Playgroud)

会收到arg1arg2

我不关心任何具体的承诺如何实现它,我希望密切关注w3c规范的承诺.

Ben*_*aum 123

我在这里遵循规范,我不确定它是否允许使用多个参数调用onFulfilled.

不,只是第一个参数将被视为promise构造函数中的分辨率值.您可以使用复合值(如对象或数组)进行解析.

我不关心任何具体的承诺如何实现它,我希望密切关注w3c规范的承诺.

那就是我认为你错了.该规范旨在最小化,并构建用于promise库之间的互操作.我们的想法是拥有一个子集,例如DOM期货可以可靠地使用并且库可以消耗.承诺实现现在做你要求.spread的一段时间.例如:

Promise.try(function(){
    return ["Hello","World","!"];
}).spread(function(a,b,c){
    console.log(a,b+c); // "Hello World!";
});
Run Code Online (Sandbox Code Playgroud)

蓝鸟.如果您想要此功能,一种解决方案是将其填充.

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); 
        });
    };
}
Run Code Online (Sandbox Code Playgroud)

这可以让你做到:

Promise.resolve(null).then(function(){
    return ["Hello","World","!"]; 
}).spread(function(a,b,c){
    console.log(a,b+c);    
});
Run Code Online (Sandbox Code Playgroud)

本土承诺轻松小提琴.或者在浏览器中使用现在(2018)常见的传播:

Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
  console.log(a,b+c);    
});
Run Code Online (Sandbox Code Playgroud)

或等待:

let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);
Run Code Online (Sandbox Code Playgroud)

  • `spread`是权宜之计.ES6引入了解构和休息/扩展运算符,从而消除了对`spread`的需求.`.then(([a,b,c])=> {})` (14认同)
  • @KrisKowal请注意.spread()隐式地执行.all()但ES6解构语法没有 - > http://bluebirdjs.com/docs/api/spread.html (3认同)
  • 请注意,其他库(如Q)也支持像Bluebird这样的`.spread` - 它不符合规范的原因是保持规范最小化只是一个大问题 - 以便允许代码和库之间的互操作. (2认同)

Woo*_*iem 61

你可以使用E6解构:

对象解构:

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled({arg1: value1, arg2: value2});
})

promise.then(({arg1, arg2}) => {
    // ....
});
Run Code Online (Sandbox Code Playgroud)

数组解构:

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled([value1, value2]);
})

promise.then(([arg1, arg2]) => {
    // ....
});
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的一个例子是_nice和helpful_! (2认同)

Esa*_*ija 17

promise的履行值与函数的返回值相似,并且promise的拒绝原因与函数的抛出异常平行.函数不能返回多个值,因此promise不得超过1个履行值.