在setTimeout中传递多个参数以承诺解析
passing multiple arguments to promise resolution within setTimeout
我试图遵循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中合并/扁平化数组的数组?
相关文章:
- 简单的ES6承诺问题-交换解决和拒绝参数
- 基于查询参数的可选承诺步骤
- ES6承诺:如何用参数链接函数
- 编写一个使用传递两个参数的回调的承诺
- 如何调试错误:;未捕获(承诺中)缺少参数单元”;
- 函数抽象和承诺函数作为参数
- 带有传递参数的角度承诺链接
- JavaScript循环承诺在参数中使用数组进行迭代
- Firebase 承诺 - Query.once 失败:使用 1 个参数调用.预计至少 2
- 咖啡脚本中的承诺.尝试将多个参数传递给“then”时出现“意外逗号”错误
- 如何将参数传递给承诺函数
- 为什么这些参数没有传递给承诺
- 用一个参数承诺 .then()
- 将承诺与多个参数链接在一起
- Angular中的链接承诺.输入参数错误
- javascript承诺不传递所有参数(使用Q)
- 拒绝AngularJS中带有多个参数(如$http)的承诺
- Node.js Q承诺多个参数
- 承诺响应参数丢失
- JavaScript承诺中错误处理参数和catch的区别