2017-02-17 14 views
3

Так что 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

Попытка использовать оператор распространения технически имеет вам вложенности функции, которая работает, но есть еще один способ

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?

2

Вместо

.then(printData) 

вы можете намазать

.then(args => printData(...args)) 
+0

Это должно быть правильный ответ – piotrbienias

4

один способ, с помощью ES 6 Destructur ING

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
function printData(...a){ 
    console.log(a.reduce((n,o)=>n.concat(o),[]).join(",")); 
} 

Возьмите все аргументы, уменьшите все массивы в массивах до одного массива, передайте их как аргументы console.log.

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

+0

Вы пропустили точку, почему это было бы полезно – lonewarrior556

+0

@ lonewarrior556 действительно? вы пробовали Promise.all ([1,2,3]), затем (printData) –

 Смежные вопросы

  • Нет связанных вопросов^_^