Node JS bluebird承诺

时间:2018-04-19 14:22:06

标签: javascript node.js promise

我正在使用节点JS创建promises。但我有一个想法,我仍然有一个回调地狱......

那是因为我需要第一次回调的结果,在第三次回调中。

我已经尝试过蓝鸟,但我对此感到困惑。

任何人都可以给我一些示例代码,我怎么能很好地写出来? 请参阅以下示例: https://gist.github.com/ermst4r/8b29bf8b63d74f639521e04c4481dabb

3 个答案:

答案 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)

非常感谢大家的反馈意见。我读到asyncasync.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();
                            });