我目前正在尝试重构我拥有的代码库,并希望拥有更加开发人员友好的代码库。第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
})
答案 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。 制作分支并且不要将它们连接在一起。