2017-09-04 75 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)}) 
    } 
相关问题