Node.js and asynchronous programming with Q

做~自己de王妃 提交于 2019-12-02 17:47:20

问题


Is the following the correct way to go about things? This is a sign up controller action. Im creating a user and a group to add the user to. Notice I have method level variables called user and group. The rest of the code is asynchronous using the Q module.

Is it ok to have the method level variables or will they be overriden by the another person signing up at the same time?

exports.postSignUp = function(req, res, next) {

    var user,
        group;

    return Q.invoke(exports, 'parseUser', req, null)
        .then(function(u)
        {
            user = u;
            return Q.invoke(exports, 'postCreateUser', user).fail(function(err) { throw err; });
        })
        .then(function()
        {
            group = new Group();
            group.userIds = [user._id];
            return Q.invoke(exports, 'postCreateGroup', group).fail(function(err) { throw err; });
        })
        .then(function()
        {
            user.groupId = group._id;
            group.userIds = [ user._id ];
        })
        .then(function()
        {
            return Q.ninvoke(req, 'login', user).fail(function(err) { throw err; });
        })
        .then(function()
        {
            return res.redirect('/tour');
        })
        .fail(function (err)
        {
            console.log('u:' + user);
            console.log('g:' + group);
            return exports.createValidationError(error, req, res, user);
        });
};

回答1:


Is it ok to have the method level variables or will they be overriden by the another person signing up at the same time?

No, they won't as they are locally scoped to your postSignUp function.

It is however a little ugly, nesting them might be the better choice here:

exports.postSignUp = function(req, res, next) {
    return Q.invoke(exports, 'parseUser', req, null).then(function(user) {
        return Q.invoke(exports, 'postCreateUser', user).then(function(createdUser) {
            var group = new Group();
            group.userIds = [user._id];
            return Q.invoke(exports, 'postCreateGroup', group).then(function(createdGroup) {
                user.groupId = group._id;
                group.userIds = [ user._id ]; // repeat this?

                return Q.ninvoke(req, 'login', user)
            }).then(function(loggedInuser) {
                return res.redirect('/tour');
            }).fail(function(err) {
               console.log('g:' + group);
               throw err;
            });
        }).fail(function(err) {
            console.log('u:' + user);
            return exports.createValidationError(error, req, res, user);
        });
    }) // .fail(function(err) {
       //     … // parseUser or createValidationError failed
       // });
};

Do I really need to break down all the different steps into different functions or can I just have 1 async function?

You have one async function currently, you might want to break that down into creating a user with a new group, and logging him in plus redirecting him to /tour.



来源:https://stackoverflow.com/questions/22570671/node-js-and-asynchronous-programming-with-q

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!