NodeJS回调:如何使调用等待mongodb查询结果

时间:2015-11-25 09:23:05

标签: angularjs node.js mongodb callback

我有一个注册对话框,当用户输入用户名和密码时,我需要检查数据库是否存在用户 或不。但是当我对同一个人进行验证时,我的电话不会停止,直到我从服务器获得结果。

经过一段时间的搜索,我了解了callbacks。所以我在this.isUser方法中添加了一个回调。 它很成功。但现在doRegistration方法与isUser方法不同步。

如何让我的所有通话同步?

this.doRegistration = function(uname, pwd, confirmPwd) {
    if(this.isUser(uname)) {
        return "USER_EXISTS";
    } else {
        saveUser(uname, pwd);
        return "SUCCESS";
    }
};

this.isUser = function(username) {
    var users = new Array();
    getAllUsers('param', function(response) {
        users = response;
        console.log(users.length);
        for(i = 0; i < users.length; i++) {
            if(users[i].username === username) {
                return true;
            }
        }
        return false;
    });
};

function getAllUsers(param, callback) {
    loginFactory.AllUsers.query(function(response) {
        if(response != undefined && response.length > 0) {
            callback(response);
        }
    });
}

1 个答案:

答案 0 :(得分:1)

您可以重写以下代码:

this.doRegistration = function(uname, pwd, confirmPwd, callBack) {
        this.isUser(uname,function(flag) {
          if(flag){
            callBack("USER_EXISTS");
          }
          else {
            saveUser(uname, pwd, function(err,result){
               if(err){
                  callBack("SAVING_FAILED");
               }
               else {
                  callBack("SUCCESS");
               }
            });
          }
        });
    };

    this.isUser = function(username,callBack) {
        var users = new Array();
        getAllUsers('param', function(response) {
            users = response;
            console.log(users.length);
            for(i = 0; i < users.length; i++) {
                if(users[i].username === username) {
                    callBack(true);
                }
            }
            callBack(false);
        });
    };

    function saveUser(userName, pwd, callBack){
        //code to save user
        //chek for error in saving
        if(err){
          callBack(err,null)
        }
        else {
          callBack(null, "success")
        }
    }

    function getAllUsers(param, callback) {
        loginFactory.AllUsers.query(function(response) {
            if(response != undefined && response.length > 0) {
                callback(response);
            }
        });
    }

您也可以将saveUser定义为具有回调功能。在这里它不会等待saveUser方法完成。