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

Javascript 在setTimeout内传递多个参数以承诺解析,javascript,asynchronous,promise,es6-promise,Javascript,Asynchronous,Promise,Es6 Promise,我试图遵循MDN示例,但似乎无法将更多参数传递给 这将打印出[1,“两个”],我希望打印出[1,2,3,“两个”]。使用setTimeout执行此操作而不履行承诺,效果与预期一样 setTimeout(cb, 100, 1, 2, 3); function cb(a, b, c){ console.log(a, b, c); } //=>1 2 3 为什么这不符合承诺?如何使它与承诺一起工作?函数只接受一个参数。你不能改变,因为这是规范 如果传递的值超过此值,则不会产生任何影响,并且

我试图遵循MDN示例,但似乎无法将更多参数传递给

这将打印出
[1,“两个”]
,我希望打印出
[1,2,3,“两个”]
。使用
setTimeout
执行此操作而不履行承诺,效果与预期一样

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

为什么这不符合承诺?如何使它与承诺一起工作?

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

如果传递的值超过此值,则不会产生任何影响,并且会忽略其他值

您可以选择将数组传递给
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()
处理程序中的
数组。这里有许多用于展平数组的技术:

如果已知
Promise
s的数量,您还可以将分解分配传递给
then
处理程序:
。然后([first,second])=>
。如何获得独立的值?
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)
});