如何在js中的if语句中等待结果?

时间:2016-04-14 21:33:35

标签: javascript node.js

我正在为一个webapp构建一个node.js后端,当我提交一个表单时,我会进行各种验证。其中一个是检查是否已存在具有相同电子邮件地址的邀请。( isUserAlreadyInvited function)

我为此创建了一个函数,但是当我调用它时,我想响应不是那么快,它只是移动到下一个语句,即使检查返回true。怎么

    //Loop through emails one by one
    var emails_to_invite = ["test@test.com","invalid.com"];
    var response_items = [];
    async.each(emails_to_invite,
        function(email, callback){

            //Response item
            var response_item = {}
            response_item.email = email;                

            //Validate
            if(Joi.validate({ email: email }, apiSchema).error) {
                response_item.error = "not valid email";
                response_items.push(response_item); 
                callback();
            } else if(email == user.email) {
                response_item.error = "Sending an invitation to your own email is kinda dumb";
                response_items.push(response_item); 
                callback();
            } else if(isUserAlreadyInvited(email,user_id)) {
                response_item.error = "already invited";
                response_items.push(response_item); 
                callback();
            } else {
                sendInvitationEmail(email,user_id,null,null,function(invitation_code){
                    if(invitation_code) {
                        response_item.invitationCode = invitation_code;
                    } else {
                        response_item.error = "server error";
                    }
                    response_items.push(response_item);     
                    callback();     
                });
            };
        },
        function(err){

            //Return response
            res.status(200).send(response_items);

        }
    );  

    function isUserAlreadyInvited(email,invited_by) {
        User.findOne({
            email: email,
            invited_by: invited_by
        }, function(err, user) {
            if(err) {
                return false;
            } else {
                return true;
            }
        });

    }

1 个答案:

答案 0 :(得分:0)

这里有两个回报:

function isUserAlreadyInvited(email,invited_by) {
        User.findOne({
            email: email,
            invited_by: invited_by
        }, function(err, user) {
            if(err) {
                return false;
            } else {
                return true;
            }
        });

    }

在此函数中定义

    function(err, user) {
            if(err) {
                return false;
            } else {
                return true;
            }
        }

并且没有任何返回值isUserAlreadyInvited()

显然你的isUserAlreadyInvited()是一个需要异步处理的异步函数 - 它应该将回调函数作为参数。应该调用该回调来代替function(err, user) {}