Node.js 如何在NodeJS中使用承诺(Bluebird)处理条件回调
我目前正在尝试重构我拥有的代码库,并希望拥有一个更为开发人员友好的代码库。第1部分是将回调更改为承诺。目前,在一些地方,我们正在使用Async.瀑布来扁平化回调地狱,这对我来说很有用。我们不能做的其他地方是因为它们是条件回调,这意味着if和else中有不同的回调函数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来表示承诺,但我不知道如何处理条件回调来消除回调地狱
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并不能解决回调地狱,它只解决了代码向右移动的速度比向前移动的速度快的情况,即提高代码的可读性。这是一个很长的答案和问题@贾建荣我会看一下执行情况,明天再给你回复。