我正在使用节点JS创建promises。但我有一个想法,我仍然有一个回调地狱......
那是因为我需要第一次回调的结果,在第三次回调中。
我已经尝试过蓝鸟,但我对此感到困惑。
任何人都可以给我一些示例代码,我怎么能很好地写出来? 请参阅以下示例: https://gist.github.com/ermst4r/8b29bf8b63d74f639521e04c4481dabb
答案 0 :(得分:1)
使用async / await来避免嵌套的promises。
您可以将代码重构为此类
async function doSomething(){
try {
const user = await UserProfileMatch.getNewUser(item.fk_user_id)
await ActiveAuctionProfile.closeActiveAuctionProfile(item.aap_id)
if(user.length > 0 ) {
const is_active = await ActiveAuctionProfile.isProfileActive(user[0].profile_id)
const number_of_profiles = await = UserProfileMatch.countActiveProfilesForUser(item.fk_user_id)
if(is_active.result === 0 && number_of_profiles < config.settings.lovingbids_start_profile) {
await UserProfileMatch.updateProfileMatch(item.fk_user_id, user[0].profile_id,1,false)
await ActiveAuctionProfile.createNewActiveProfile({
fk_auction_profile_id:user[0].profile_id,
start_date:moment().format("YYYY-MM-DD HH:mm:ss") ,
expire_date:moment().add(config.settings.increment_settings,'seconds').format("YYYY-MM-DD HH:mm:ss")
})
ExpireProfileRegister.removeExpireResult(item.id);
page++;
next();
} else {
console.log("exists");
ExpireProfileRegister.removeExpireResult(item.id);
page++;
next();
}
} else {
console.log("niet");
page++;
next();
}
}catch(err){
console.log("One of the promises failed:", err)
}
}
请注意,我们使用async
声明包装函数,而不是嵌套回调,我们使用await来告诉async函数在运行下一行代码之前等待此函数完成。
另请注意,所有await函数都包含在try / catch块中以捕获任何错误。这不是使用.catch()
表示法。
详细了解异步函数here
答案 1 :(得分:0)
我无法调试,但是这些内容应该会正确地使用promises为您提供重构代码。
UserProfileMatch.getNewUser(item.fk_user_id)
.then(user => ActiveAuctionProfile.closeActiveAuctionProfile(item.aap_id))
.then(() => user.length > 0 ? ActiveAuctionProfile.isProfileActive(user[0].profile_id)
: (console.log("niet"), page++, next()))
.then(is_active => [UserProfileMatch.countActiveProfilesForUser(item.fk_user_id), is_active.result])
.then(([number_of_profiles,n]) => n === 0 &&
number_of_profiles < config.settings.lovingbids_start_profile ? UserProfileMatch.updateProfileMatch(item.fk_user_id, user[0].profile_id,1,false))
: (console.log("exists"),
ExpireProfileRegister.removeExpireResult(item.id),
page++,
next());
.then(() => ActiveAuctionProfile.createNewActiveProfile({ fk_auction_profile_id: user[0].profile_id,
start_date : moment().format("YYYY-MM-DD HH:mm:ss") ,
expire_date : moment().add(config.settings.increment_settings,'seconds').format("YYYY-MM-DD HH:mm:ss")
})
.then(() => (ExpireProfileRegister.removeExpireResult(item.id), page++, next()));
请注意,在第3 then
阶段,我返回了一个类似
[UserProfileMatch.countActiveProfilesForUser(item.fk_user_id), is_active.result]
将is_active.result
带到下一个then
阶段,我们通过数组解构将其收集到n
。
答案 2 :(得分:0)
非常感谢大家的反馈意见。我读到async
和async.series
似乎对我来说是最好的方式。它使我的代码保持结构化。见....
var get_user;
var user_active;
var user_profile;
async.series([
// check for the new user
function checkForNewUser(callback)
{
UserProfileMatch.getNewUser(item.fk_user_id).then(function (user) {
get_user = user;
callback(null,user);
});
},
// close the profile
function closeProfile(callback)
{
ActiveAuctionProfile.closeActiveAuctionProfile(item.aap_id).then(function () {
if (get_user.length > 0) {
ActiveAuctionProfile.isProfileActive(get_user[0].profile_id).then(function (is_active) {
user_active = is_active.result;
callback(null,user_active);
});
} else {
callback(null,false);
}
});
},
// count the active profiles
function countActiveProfiles (callback) {
UserProfileMatch.countActiveProfilesForUser(item.fk_user_id).then(function (number_of_profiles) {
user_profile = number_of_profiles;
callback(null,user_profile);
});
},
// decide when we want to create an user
function determineCreation(callback) {
if(user_active === 0 && user_active === 0) {
UserProfileMatch.updateProfileMatch(item.fk_user_id, get_user[0].profile_id, 1, false).then(function () {
ActiveAuctionProfile.createNewActiveProfile({
fk_auction_profile_id: get_user[0].profile_id,
start_date: moment().format("YYYY-MM-DD HH:mm:ss"),
expire_date: moment().add(config.settings.increment_settings, 'seconds').format("YYYY-MM-DD HH:mm:ss")
}).then(function () {
ExpireProfileRegister.removeExpireResult(item.id);
callback(null,true);
});
});
} else {
ExpireProfileRegister.removeExpireResult(item.id);
callback(null,true);
}
}
], function(err,res) {
// after done, go to the next page
page++;
next();
});