承诺可以有多个论据来履行吗?

2022-08-30 03:05:24

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

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled('arg1', 'arg2');
})

这样我的代码:

promise.then(function(arg1, arg2){
    // ....
});

将同时收到 和 ?arg1arg2

我不关心任何特定的承诺实现是如何做到的,我希望严格遵循w3c规范的承诺。


答案 1

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

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

我不关心任何特定的承诺实现是如何做到的,我希望严格遵循w3c规范的承诺。

这就是我认为你错了的地方。该规范被设计为最小,并且为承诺库之间的互操作而构建。这个想法是有一个子集,例如DOM期货可以可靠地使用,库可以使用。承诺实现可以做你要求一段时间的事情。例如:.spread

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

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

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', '!']);

答案 2

您可以使用 E6 解构:

对象解构:

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

promise.then(({arg1, arg2}) => {
    // ....
});

数组解构:

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

promise.then(([arg1, arg2]) => {
    // ....
});