2017-02-17 5 views
3

Also Promise.all übergibt ein Array als Wert in die Funktion, ich würde lieber die Array-Werte als Argumente übergeben.Ist es möglich, das Eingabearray in Argumente zu verteilen?

nehme ich diese Funktion haben:

function printData(a,b,c){ 
    console.log(a,b,c) 
} 

ich

dies dort dies ein besserer Weg ist stattdessen

>> 1 2 3 

möchte

Promise.all([1,2,3]).then(printData) 
>> [1,2,3] undefined undefined 

drucken zu tun:

Promise.all([1,2,3,4]).then(function(values){printData.apply(null, values)}) 

mit dem Spread-Operator?

Ich habe auch versucht

Promise.all([1,2,3]).then(printData.apply) 

Aber es gibt einen Fehler

Antwort

0

Der Versuch, die Ausbreitung Operator zu verwenden technisch hat Sie nisten Funktionen, die funktioniert, aber es ist eine andere Art und Weise

Promise.all([1,2,3]).then(printData.apply)

funktioniert nicht, da diese gleich:

printData.apply.call(undefined, [1,2,3]) 

, die den gleichen Fehler

zurückgibt
>>Uncaught TypeError: Function.prototype.apply was called on undefined, 
which is a undefined and not a function 

Promise geht this um call und es verliert Spur von dem, was es sein sollte. Was Sie wollen, ist:

test.apply.call(test,[null,1,2,3]) 

, die gleich:

test.apply(null,[1,2,3]) 

, die gleich

test(1,2,3) 

weil Sie die Kontrolle über Versprechen nicht Anruf mit, verwenden bind die Argumente, um zu bestimmen

printData.apply.bind(printData, null) 

denen genannt, wenn gleich

printData.apply.bind(printData, null).call(undefined, [1,2,3]) 
>> 1 2 3 

so schließlich:

Promise.all([1,2,3]).then(printData.apply.bind(printData,null)) 
>> 1 2 3 

Hier ist eine ähnliche Frage gelten und Why can I not call a function.apply?

2

Statt

.then(printData) 

können Sie mit

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

Dies sollte die richtige Antwort – piotrbienias

4

Eine Möglichkeit, verteilt mit 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);});

Mit ES 6 Verbreitung Syntax

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(",")); 
} 

Nehmen Sie alle Argumente, reduzieren Sie alle Arrays in Arrays auf ein Array und übergeben Sie sie als Argumente an die Datei console.log.

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

+0

Sie verfehlten den Punkt nennen die Kombination warum das wäre nützlich – lonewarrior556

+0

@ lonewarrior556 wirklich? hast du versucht Promise.all ([1,2,3]). dann (printData) –

Verwandte Themen