如何在NodeJS中使用Promises(Bluebird)处理条件回调

时间:2016-11-30 07:05:04

标签: node.js callback bluebird

我目前正在尝试重构我拥有的代码库,并希望拥有更加开发人员友好的代码库。第1部分是将回调更改为Promises。目前,在某些地方,我们正在使用Async.waterfall来平坦回调地狱,这对我有用。我们不能的其余地方是因为它们是条件回调,这意味着if和else中的不同回调函数

if(x){
    call_this_callback()
}else{
    call_other_callback()
}

现在我在Node.JS中使用bluebird for promises,我无法弄清楚如何处理条件回调以平坦回调地狱。

修改 一个更现实的场景,考虑到我没有得到问题的关键。

var promise = Collection1.find({
    condn: true
}).exec()
promise.then(function(val) {
    if(val){
        return gotoStep2();
    }else{
        return createItem();
    }
})
.then(function (res){
    //I don't know which response I am getting Is it the promise of gotoStep2
    //or from the createItem because in both the different database is going
    //to be called. How do I handle this
})

2 个答案:

答案 0 :(得分:2)

没有魔力,你可以轻松地在承诺中与return链接承诺。

var promise = Collection1.find({
    condn: true
}).exec();

//first approach
promise.then(function(val) {
    if(val){
        return gotoStep2()
          .then(function(result) {
            //handle result from gotoStep2() here
          });
    }else{
        return createItem()
          .then(function(result) {
            //handle result from createItem() here
          });
    }
});

//second approach
promise.then(function(val) {
    return new Promise(function() {
        if(val){
            return gotoStep2()
        } else {
            return createItem();
        }
    }).then(function(result) {
        if (val) {
            //this is result from gotoStep2();
        } else {
            //this is result from createItem();
        }
    });
});

//third approach
promise.then(function(val) {
    if(val){
        return gotoStep2(); //assume return array
    } else {
        return createItem(); //assume return object
    }
}).then(function(result) {
    //validate the result if it has own status or type
    if (Array.isArray(result)) {
        //returned from gotoStep2()
    } else {
        //returned from createItem()
    }
    //you can have other validation or status checking based on your results
});

编辑:更新示例代码,因为作者更新了他的示例代码。 编辑:添加第3种方法以帮助您了解承诺链

答案 1 :(得分:0)

这是promise分支的answer:嵌套和unnested。 制作分支并且不要将它们连接在一起。