是否可以将输入数组扩展到参数中?

时间:2017-02-17 18:05:15

标签: javascript ecmascript-6 promise

所以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)

但它返回错误

4 个答案:

答案 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

Promisethis传递给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。

http://jsbin.com/vutizahago/edit?console