所以Promise.all将一个数组作为值传递给函数,我宁愿它将数组值作为参数传递。
假设我有这个功能:
function printData(a,b,c){
console.log(a,b,c)
}
我想
Promise.all([1,2,3]).then(printData)
>> [1,2,3] undefined undefined
改为打印
>> 1 2 3
有没有更好的方法:
Promise.all([1,2,3,4]).then(function(values){printData.apply(null, values)})
使用点差运算符?
我也试过
Promise.all([1,2,3]).then(printData.apply)
但它返回错误
答案 0 :(得分:4)
使用ES 6的一种方法解构
function printData(a,b,c){
console.log(a,b,c)
}
Promise.all([1,2,3]).then( data => {var [a,b,c] = data;
printData(a,b,c);});

使用ES 6 Spread 语法
function printData(a,b,c){
console.log(a,b,c)
}
Promise.all([1,2,3]).then(data => printData(...data))

答案 1 :(得分:2)
而不是
.then(printData)
你可以传播
.then(args => printData(...args))
答案 2 :(得分:0)
在技术上尝试使用扩展运算符有嵌套函数,这是有效的,但还有另一种方法
Promise.all([1,2,3]).then(printData.apply)
不起作用,因为它等于:
printData.apply.call(undefined, [1,2,3])
返回相同的错误
>>Uncaught TypeError: Function.prototype.apply was called on undefined,
which is a undefined and not a function
Promise
将this
传递给call
,并且它会失去对它应该是什么的追踪。
你想要的是:
test.apply.call(test,[null,1,2,3])
等于:
test.apply(null,[1,2,3])
等于
test(1,2,3)
因为您无法使用调用控制Promise,请使用bind
来确定参数
printData.apply.bind(printData, null)
当被称为等于
时printData.apply.bind(printData, null).call(undefined, [1,2,3])
>> 1 2 3
所以最后:
Promise.all([1,2,3]).then(printData.apply.bind(printData,null))
>> 1 2 3
这是关于组合申请和通话的相关问题 Why can I not call a function.apply?
答案 3 :(得分:-1)
function printData(...a){
console.log(a.reduce((n,o)=>n.concat(o),[]).join(","));
}
获取所有参数,将Arrays中的所有Arrays减少为一个Array,并将其作为参数传递给console.log。