繁体   English   中英

使用多个Promise的Node.js

[英]Node.js using multiple promises

我目前尝试使用两种诺言。 一种用于整个会议,另一种用于将用户标识转换为用户名。

该代码在首次运行时有效,并且看起来像这样: 在此处输入图片说明

上面的输出是我想要的。

但是当我再次运行查询时,我得到了: 在此处输入图片说明

我的代码有什么问题? 我需要怎么做才能正确履行诺言?

码:

function getconvensations(userid) {
    return new Promise(function(resolve, reject) {

        convensations.find({members: userid}).lean().then(function (convensations) {
            var promises = convensations.map(function (currentConvensation) {
                return new Promise(function (resolve, reject) {
                    var realnames = [];
                    var usernames = currentConvensation.members.map(function (CurrentUser) {
                        Core.userDetails(CurrentUser).then(function (user) {
                            realnames.push(user.username);
                            console.log("RESOLVING USERNAMES");
                           resolve();
                        });
                    });

                    Promise.all(usernames).then(function () {
                        console.log("GET LATEST MESSAGE");
                        latestMessage(currentConvensation._id).then(function (message) {
                            console.log("Messages: ");
                            console.log(message);
                            currentConvensation.spesificmessage = message;
                            currentConvensation.users = realnames;
                            currentConvensation.otherend = (currentConvensation.members[0] == userid ? realnames[0] : realnames[1]);

                            console.log("RESOLVE LATEST MESSAGE");


                            resolve();
                        });
                    });
                });
            });

            Promise.all(promises).then(function () {
                console.log("FINISHED CONVENSATIONS");
                console.log("-------------------------");
                console.log(convensations);
                console.log("-------------------------");
                return resolve(convensations);
            }).catch(console.error);
        });
    });
}

呼叫者:

  } else if(action == 'getconvensations') {
        Messages_model.getconvensations(req.user._id).then(function (response) {
            res.json(response);
        });
    }

您的比赛条件如下:

new Promise(function (resolve, reject) {
    …
    currentConvensation.members.map(function (CurrentUser) {
        Core.userDetails(CurrentUser).then(function (user) {
            resolve();
        });
    });
    …
    latestMessage(currentConvensation._id).then(function (message) {
        resolve();
    });
    …
});

任意同时执行许多任务,第一个实现的承诺将调用resolve()

解决方案是避免Promise构造函数反模式,并且永远不要调用new Promise或手动resolve 相反, 连锁承诺回调对方使用then方法,并return从每一个新功能的承诺,允许呼叫者等待他们。

function getconvensations(userid) {
    return convensations.find({members: userid}).lean().then(function (convensations) {
//  ^^^^^^
        var promises = convensations.map(function (currentConvensation) {
            var usernamepromises = currentConvensation.members.map(function (CurrentUser) {
                console.log("GETTING USERNAME");
                return Core.userDetails(CurrentUser).then(function (user) {
//              ^^^^^^
                    console.log("FULFILLED USERNAME");
                    return user.username;
//                  ^^^^^^
                });
            });
            return Promise.all(usernamepromises).then(function (realnames) {
//          ^^^^^^
                console.log("FULFILLED ALL USERNAMES");
                currentConvensation.users = realnames;
                currentConvensation.otherend = (currentConvensation.members[0] == userid ? realnames[0] : realnames[1]);

                console.log("GETTING LATEST MESSAGE");
                return latestMessage(currentConvensation._id);
//              ^^^^^^
            }).then(function (message) {
                console.log("FULFILLED LATEST MESSAGE");
                console.log("Message: ", message);
                currentConvensation.spesificmessage = message;
            });
        });
        return Promise.all(promises).then(function () {
//      ^^^^^^
            console.log("FINISHED ALL CONVENSATIONS");
            console.log("-------------------------");
            console.log(convensations);
            console.log("-------------------------");
            return convensations;
//          ^^^^^^
        });
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM