2017-05-05 3 views
0

Ich habe ein verwirrendes Problem passieren:Wie die den Rückgabewert des ersten Versprechen an die letzte in einer verketteten Versprechen

I Versprechen Kette bin mit einigen Funktionen aufrufen wie folgt:

CommonPromiseLists.checkStatusPromise().then(CommonPromiseLists.getChannelPreferencePromise).then(CommonPromiseLists.getChannelsPromise).then(getUniqueStory.bind(null, storyId)) 

Wie Sie sehen, werden die Funktionen konsequent aufgerufen und ich bekomme die richtigen Ergebnisse. Auf der Grundlage der letzten Anforderungsänderungen muss ich nun den Rückgabewert von CommonPromiseLists.checkStatusPromise() an getUniqueStory.bind (null, storyId) übergeben, was das letzte Versprechen ist, das ich anrufe. Ich habe eine Lösung im Sinn: Wenn ich zurückkomme und den zurückgegebenen Wert dem nächsten Versprechen übergebe, kann ich auch den zurückgegebenen Wert des ersten Versprechens einbeziehen. Aber ich glaube, dass es einen einfacheren Weg geben sollte. Gibt es einen besseren Weg, den zurückgegebenen Wert von checkStatusPromise() zu erhalten und ihn an getUniqueStory.bind (null, storyId, den Rückgabewert des ersten Versprechens) zu übergeben?

+0

Verwenden Sie babel Ihren Code zu kompilieren? – gargantuan

+0

@gargantuan Ja, ich mache –

Antwort

2

Sie die Ergebnisse durch die Versprechen Kette passieren könnte, aber das macht Der Code ist eng gekoppelt, sodass nachfolgende Callbacks eine merkwürdige Struktur als aufgelösten Wert voraussehen müssen.

Mit einfachen Versprechungen ist es einfacher, den Rest der Operation in den Rückruf checkStatusPromise einzuschließen. Auf diese Weise wird das Ergebnis checkStatusPromise angezeigt.

CommonPromiseLists.checkStatusPromise().then(res => { 
    return CommonPromiseLists.getChannelPreferencePromise(res) 
    .then(CommonPromiseLists.getChannelsPromise) 
    .then(getUniqueStory.bind(null, storyId, res)) // access res 
}); 

Wenn Sie Asynchron-await verwenden können, wird es ein wenig einfacher:

async enclosingFunction(){ 
    const status = await CommonPromiseLists.checkStatusPromise(); 
    const channelPreference = await CommonPromiseLists.getChannelPreferencePromise(status); 
    const channels = await CommonPromiseLists.getChannelsPromise(channelPreference); 
    const uniqueStory = await getUniqueStory.bind(null, storyId, res) 
    return uniqueStory; 
} 

enclosingFunction().then(value => /* results */) 
+0

Vielen Dank für die vollständige Antwort Ich schätze es –

0

Speichern Sie einfach führen, wenn Sie benötigt:

let res; 
func1().then(result=>{ 
    res = result; 
    return func2(); 
}) 
.then(func3) 
.then(func4) 
... 
then(result=>{ 
    ... 
    return res; //return result that you save as result of the first promise 
}) 
.catch(err=>{ 
    throw err; 
}) 

Wenn Sie einige Schritte wollen auslässt Sie wie folgt tun:

let res; 

func1().then(result=>{ 
    res = result; 
    if(res) //you check of the result 
     return func2().then(func3); 
    else 
     return func4(); 
}) 
then(result=>{ 
    ... 
    return res; //return result that you save as result of the first promise 
}) 
.catch(err=>{ 
    throw err; 
}) 
+0

So kann ich Res an Fun4 senden oder sollte ich warten auf alle Anrufe zu beenden? –

+0

Wenn Sie einige Schritte auslassen wollen, sehen Sie, dass ich die Antwort geändert habe – Sergaros

1

Versprechen vielleicht nicht, was Sie hier verwenden müssen. Es sieht so aus, als ob du entweder einen Generator oder async/await brauchst. Ich werde async verwenden/hier warten, da es einfacher zu verstehen ist.

Imagine Sie eine Funktion haben, die ein Versprechen wie dieses

function double(someVal) { 
    return new Promise(resolve => { 
     setTimeout(() => { 
      resolve(someVal * 2); 
     }, 2000); 
     }); 
} 

zurück Sie könnten die Verwendung async/erwarten ähnliche

async function sumMultiplications() { 
    var a = await double(5); 
    var b = await double(20); 
    var c = await double(a); 
    return a + b + c; 
} 

Wenn ein Asynchron-Funktion aufgerufen wird, gibt sie ein Versprechen. Wenn die asynchrone -Funktion einen Wert zurückgibt, wird das Versprechen mit dem zurückgegebenen Wert aufgelöst. Wenn die Async-Funktion eine Exception oder einen Wert von auslöst, wird die Promise mit dem geworfenen Wert zurückgewiesen.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

+0

Vielen Dank für die Antwort. Für jeden, der diesen Beitrag sieht, würde ich vorschlagen, diese Antwort zu lesen, um eine bessere Idee zu bekommen –

Verwandte Themen