2017-09-04 3 views
0

Ich benutze Node.js und q-Bibliothek.Ist es möglich, Wert von .resolve() außerhalb des Geltungsbereichs. Then() zurückgegeben werden?

Ich habe einen Code, der wie folgt aussieht:

checkIfThingExists(function(idForAThing){ 
    if(idForAThing){ 
    updateThingData(idForAThing); 
    } else { 
    createThing(function(idForAThing){ 
     updateThingData(idForAThing); 
    }); 
    } 
}) 

Wie Sie sehen, ich brauche updateThingData zu nennen(); zweimal.

Gibt es einen Weg, wie ich Versprechungen verwenden kann, updateThingData() nur einmal anrufen, zum Beispiel so etwas? Natürlich funktioniert das nicht und idForAThing ist immer undefined, wenn die if-Anweisung lautet:

checkIfThingExists(function(idForAThing){ 

    if(!idForAThing){ 
    createThing().then(function(newIdForAThing){ 
     idForAThing = newIdForAThing 
    }) 
    } 

    updateThingData(idForAThing); 
}) 
+1

Nein, es ist nicht möglich, den Wert vor dem 'then' Rückruf zu bekommen, das ist der ganze Sinn verspricht. Sie können [jedoch ein Versprechen bedingt verwenden und asynchron fortfahren] (https://stackoverflow.com/a/39621747/1048572). – Bergi

Antwort

0

Eigentlich, was geschieht, ist die .then Methode ein Rückruf ist. Es wird erst aufgerufen, nachdem updateThingData aufgerufen wird.

Sie könnten stattdessen eine Versprechenskette erstellen, die aufgelöst wird, nachdem sie die ID hat. Verknüpfen Sie dann den nächsten Rückruf .then, um updateThingData aufzurufen. Hier ist ein Beispiel dafür:

checkIfThingExists(function(idForAThing){ 
 
    return Q.resolve() // or Promise.resolve if you were using the browser implementation 
 
    .then(function() { 
 
     if(!idForAThing) return createThing() 
 
     return idForAThing 
 
    }) 
 
    .then(updateThingData) 
 
})

0

Sie haben ein Versprechen, auf jeden Fall zurück. So :

checkIfThingExists(function(idForAThing){ 
    var promise 

    if(!idForAThing) 
    promise = createThing() 
    else 
    promise = Promise.resolve(idForAThing) 

    promise.then(function(id){ 
    updateThingData(id)}) 
    } 
Verwandte Themen