【问题标题】:passing multiple arguments to promise resolution within setTimeout在 setTimeout 内将多个参数传递给 promise 解决方案
【发布时间】:2016-09-28 01:27:24
【问题描述】:

我试图跟随 MDN promise.all 示例,但似乎我无法将更多参数传递给 setTimeout callback

var p1 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 200, 1,2,3); 
});
var p2 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 500, "two"); 
});

Promise.all([p1, p2]).then(value => { 
  console.log(value);
}, reason => {
  console.log(reason)
});

这会打印出[1, "two"],我预计会出现[1, 2, 3, "two"]。在没有承诺履行的情况下使用setTimeout 执行此操作会按预期工作

setTimeout(cb, 100, 1, 2, 3);
function cb(a, b, c){
  console.log(a, b, c);
}
//=>1 2 3

为什么这不适用于承诺?如何让它与承诺一起工作?

【问题讨论】:

    标签: javascript asynchronous promise es6-promise


    【解决方案1】:

    resolve 函数只接受一个参数。您无法更改,因为这是规范。

    传递更多的值并没有什么不同,并且您的其他值将被忽略。

    您可以选择将数组传递给resolve 函数,但您将在then 处理程序上获得一个数组,而不是您想要的独立值。

    【讨论】:

    • 如何获得独立值?
    【解决方案2】:

    resolve() 只接受和处理一个参数,一个已履行的承诺只有一个值。这是根据承诺规范,您无法更改。

    如果您想传递多条信息,那么您可以将多条数据包装到一个数组或一个对象中,并将该对象用作解析值,然后更改接收代码以在包装中访问它对象:

    var p1 = new Promise((resolve, reject) => { 
      // put multiple resolved values into an array
      setTimeout(resolve, 200, [1,2,3]), 200); 
    });
    var p2 = new Promise((resolve, reject) => { 
      setTimeout(resolve, 500, "two"); 
    });
    
    Promise.all([p1, p2]).then(value => { 
      console.log(value);   // [[1,2,3], "two"]
    }, reason => {
      console.log(reason)
    });
    

    如果您确实希望最终 .then() 处理程序中没有嵌入数组的独立值,那么您可以在处理结果之前将 .then() 处理程序中的 value 数组展平。这里有很多扁平化数组的技术:Merge/flatten an array of arrays in JavaScript?

    【讨论】:

    • 您还可以将解构赋值传递给then 处理程序,前提是已知Promises 的数量:.then(([first, second]) =>
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多