【问题标题】:NodeJS callback: How to make the call wait for mongodb query resultNodeJS回调:如何使调用等待mongodb查询结果
【发布时间】:2015-11-25 09:23:04
【问题描述】:

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

经过一段时间的搜索,我了解了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);
        }
    });
}

【问题讨论】:

  • 同样,您也必须在 isUser 方法中使用回调作为第二个参数
  • @PitchaiPazhani 这是唯一的方法吗?
  • 这是处理异步调用的完美方式。

标签: angularjs node.js mongodb callback


【解决方案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 方法完成。

【讨论】:

  • 正是 .. saveUser 不等待。你能举个例子来保存用户吗?
  • +1 谢谢。为我完成此操作后,我的代码看起来一团糟。它看起来像一个回调启动。有更好的方法吗?我很确定我想更改我的代码。
猜你喜欢
  • 2019-04-02
  • 2015-10-24
  • 2019-04-19
  • 2020-06-07
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多