在setTimeout中传递多个参数以承诺解析

passing multiple arguments to promise resolution within setTimeout

本文关键字:参数 承诺 setTimeout      更新时间:2023-09-26

我试图遵循MDN的承诺。所有的例子,但似乎我不能传递更多的参数setTimeout回调。

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

为什么这不能与承诺一起工作?怎样才能使承诺实现呢?

resolve函数只接受一个参数。你不能改变它,因为这是规范。

传递更多的值没有区别,其他值将被忽略。

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

resolve()只接受和处理一个参数,一个完成的promise只有一个值。这是根据承诺规范,你不能改变的。

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

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数组。这里有许多技术用于扁平化数组:在JavaScript中合并/扁平化数组的数组?