Обратный вызов NodeJS: как заставить вызов ждать результата запроса mongodb

0

У меня есть диалоговое окно регистрации, в котором, когда пользователь вводит имя пользователя и пароль, мне нужно проверить базу данных, присутствует ли пользователь или нет. Но когда я проверяю на то же самое, мой вызов не сдерживается, пока я не получу результаты с сервера.

После того, как я искал какое-то время, я узнал о 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);
        }
    });
}
  • 0
    Опять же, вы должны использовать обратный вызов в качестве второго аргумента в методе isUser тоже
  • 0
    @PitchaiPazhani Это единственный способ?
Показать ещё 1 комментарий
Теги:
callback

1 ответ

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.

  • 0
    Точно .. saveUser не ждет. Можете ли вы привести пример для сохранения пользователя здесь?
  • 0
    смотри мое редактирование. Я добавил пример saveUser
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню