2017-09-04 74 views
0

我正在使用Node.js和q庫。是否有可能獲得由.then()作用域之外的.resolve()返回的值?

我有一個看起來像這樣的代碼:

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

正如你可以看到我需要調用updateThingData();兩次。

有沒有一種方法可以使用承諾只需撥打updateThingData()一次,例如這樣的事情?當然,這並不工作,idForAThing總是undefined if語句運行時:

checkIfThingExists(function(idForAThing){ 

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

    updateThingData(idForAThing); 
}) 
+1

不,這是不可能的'then'回調之前得到的價值,這是承諾的關鍵所在。但是,您[可以有條件地使用承諾並進行異步](https://stackoverflow.com/a/39621747/1048572)。 – Bergi

回答

0

實際上,正在發生的事情是.then方法是回調。在調用updateThingData之後它纔會被調用。

您可以改爲創建一個承諾鏈,該鏈在擁有該標識後解析。然後鏈接下一個.then回調來調用updateThingData。下面是一個例子:

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

你必須在任何情況下返回一個承諾。 所以:

checkIfThingExists(function(idForAThing){ 
    var promise 

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

    promise.then(function(id){ 
    updateThingData(id)}) 
    } 
相關問題