gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:39 25 4
gpt4 key购买 nike

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

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

现在我在 Node.JS 中使用 bluebird 来实现 promise ,但我不知道如何处理条件回调来消除回调 hell 。

编辑考虑到我没有捕获问题的关键,更现实的场景。

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

最佳答案

这并没有什么魔力,您可以轻松地在 Promise 中使用 return 链接 Promise。

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

编辑:更新示例代码,因为作者更新了他的示例代码。编辑:添加了第三种方法来帮助您理解 promise 链

关于node.js - 如何在 NodeJS 中使用 Promises(Bluebird) 处理条件回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40882233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com