2017-08-24 2 views
0

Lets sagen, dass ich den folgenden Code haben:Kannst du synchron nach einem Promise weitermachen?

var myData = []; 

var future = Promise.All([getPromise1, getPromise2]).then((result)=>{ 
    var myData = result [] 
}).catch((err)=>{ 
    \\Do something with err 
}) 

doSomething (myData); 

Kann ich mit myData etwas tun, nachdem sie die Daten von promise.all Ergebnis erhalten hat? Oder muss ich nachfolgenden Code innerhalb eines Versprechens .then() behandeln.

Beispiel:

future.then((data)=>{ 
    doSomething(myData); 
}); 

Ich fühle mich wie ich ein paar .then schaffen würde() 's, um jede Art von Synchroncode zu halten Handhabung. Obwohl ich glaube, da myData das Ergebnis ist dann jeder Code, der die Daten in Folge verwendet, sollte wie als Teil dieses Versprechen behandelt werden:

var future = Promise.All([getPromise1, getPromise2]).then((result)=>{ 
    doSomething(result []) 
}).catch((err)=>{ 
    \\Do something with err 
}) 

Bin Verständnis ich ihn nur alles falsch? Freue mich auf Gedanken und Meinungen!

P. S im arbeitet an node.js

+0

Sie können Ihre synchronen Sachen in eine Funktion, so dass Sie * dann (yourFunction) * nur einmal aufrufen müssen. – Robert

+2

kurze Antwort ist nein, weil asynchroner Code immer asynchron ist - lange Antwort ist, können Sie Ihren Code wie Sie wollen, mit async/erwarten - siehe https://jsfiddle.net/4ghfdjcy/ - oder vielleicht richtig https: //jsfiddle.net/4ghfdjcy/1/ –

Antwort

0

Sie sind richtig, das Ergebnis der Versprechen kann nur innerhalb der Verheißung des .then verwendet werden.

Seitliche Anmerkung - nachfolgende Versprechen müssen nicht notwendigerweise verschachtelt sein, stattdessen können sie verkettet werden. Zum Beispiel:

myPromise(foo).then(bar => { 
    // Do something with the result 
    baz = bar * 2 

    // Pass the result to some other promise 
    return mySecondPromise(baz) 
}).then(foo2 => { 
    // Output the result of the second promise 
    console.log(foo2) 
}).catch(err => { 
    console.error(err) 
}); 

Fehler werden sich in der Kette fortpflanzen.

0

Sie müssen nachfolgenden Code innerhalb der Funktionsrückruf behandeln. Der Grund, warum Sie nichts außerhalb der Versprechenskette tun können, ist die Art und Weise, wie Promises funktioniert. eine schnelle Google-Suche über asynchrones Javascript gibt an explanation, warum dies ist. Die kurze Antwort ist, dass doSomething(myData) ausgeführt wird, bevor der Code in der -Funktion ausgeführt wird, was bedeutet, dass MyData immer noch ein leeres Array sein wird, wenn das Skript diesen Punkt im Code erreicht.

Eigentlich, auch wenn der Code irgendwie die .then() Funktion vor dem doSomething(myData) Methode erreichen würde, würde myData noch ein leeres Array sein, weil die myData in der .then() Funktion deklariert ist ganz eine andere Variable, es da als

erklärt
var myData 

Wenn Sie Code schreiben möchten, der sieht synchroner ist, empfehle ich, async/await zu verwenden, abhängig davon, ob Ihre Version von node.js es unterstützt oder wenn Sie einen transpiler verwenden. Mit async/erwarten Sie Ihren Code würde wie aussehen:

async function() { 
    try { 
     var myData = await Promise.all([getPromise1, getPromise2]); 
     doSomething(myData); 
    } catch (ex) { 
     // Do something with err 
    } 
} 
+0

Korrigieren Sie mich, wenn ich falsch liege, aber var myData hat einen globalen Gültigkeitsbereich. Wenn die Promise.All dann aufgelöst wird, dann kann ((result)) in myData plaziert werden und dann von dort fortgeführt werden, um doSomething (myData) auszuführen. –

+0

Ich denke du meinst myData kann in die .then platziert werden (result => {. ..}) Rückrufen? Und ja, Sie müssen nur das Schlüsselwort 'var' vor myData innerhalb des Callbacks entfernen, um auf das globale myData-Objekt zu verweisen. –

+0

Ich habe nicht einmal bemerkt, dass extra var. Vielen Dank. –

Verwandte Themen