在 setTimeout 中将多个参数传递给 promise 解析

passing multiple arguments to promise resolution within setTimeout

我试图跟随 MDN promise.all example but it seems I cannot pass more arguments to the 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

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

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

传递超过该值没有任何区别,您的其他值将被忽略。

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

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?