Node.js 如何在NodeJS中使用承诺(Bluebird)处理条件回调

Node.js 如何在NodeJS中使用承诺(Bluebird)处理条件回调,node.js,callback,bluebird,Node.js,Callback,Bluebird,我目前正在尝试重构我拥有的代码库,并希望拥有一个更为开发人员友好的代码库。第1部分是将回调更改为承诺。目前,在一些地方,我们正在使用Async.瀑布来扁平化回调地狱,这对我来说很有用。我们不能做的其他地方是因为它们是条件回调,这意味着if和else中有不同的回调函数 if(x){ call_this_callback() }else{ call_other_callback() } 现在我在Node.JS中使用bluebird来表示承诺,但我不知道如何处理条件回调来消除回调地狱

我目前正在尝试重构我拥有的代码库,并希望拥有一个更为开发人员友好的代码库。第1部分是将回调更改为承诺。目前,在一些地方,我们正在使用Async.瀑布来扁平化回调地狱,这对我来说很有用。我们不能做的其他地方是因为它们是条件回调,这意味着if和else中有不同的回调函数

if(x){
    call_this_callback()
}else{
    call_other_callback()
}
现在我在Node.JS中使用bluebird来表示承诺,但我不知道如何处理条件回调来消除回调地狱

编辑 一个更现实的场景,考虑到我没有抓住问题的关键

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
})

没有魔法,你可以轻松地将承诺与承诺中的
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
});
编辑:更新示例代码,因为作者更新了其示例代码。 编辑:添加了第三种方法,以帮助您理解承诺链。以下是承诺分支的方法:嵌套和不嵌套。
创建分支,不要将它们连接在一起。

这里您使用的是三个回电。将调用哪一个?我刚刚编辑了这个问题。我发现的第一种方法令人沮丧,因为它在回调中促进回调,我不希望这样。第二种是一种更通用的方法,需要使用闭包,我需要确保在所有连续链接函数中有不同的变量。第三种方法适用于两个不同函数的不同数据类型。它们似乎都不够通用,但在这个时候就可以了。将继续寻找更优雅的解决方案。如果找到,将更新它。谢谢你抽出时间。非常感谢。在方法1中,如果您有
if-inside if
。这将使那些被视为地狱解决方案的承诺落空。现在我有一个我不明白的问题。如果要将返回的结果与
gotoStep2
createItem
区分开来,我可以假设您有不同的逻辑来处理结果。在第一种方法中,它分离并链接逻辑以处理来自不同函数的结果。我想你误解了一点,Promise并不能解决回调地狱,它只解决了代码向右移动的速度比向前移动的速度快的情况,即提高代码的可读性。这是一个很长的答案和问题@贾建荣我会看一下执行情况,明天再给你回复。