Как вернуть переменную из обещания Q Node?

0

У меня есть обучающая игра, использующая Angular, Express, Mongo и Node. Теперь я изучаю, как использовать обещания, поэтому я могу подождать, пока что-то не закончится, прежде чем начинать что-то еще.

Прямо сейчас, я пытаюсь подождать, пока база данных не сообщит, имеет ли пользователь, пытающийся войти в систему, учетную запись. Мне это удалось, поэтому, если пользователь не существует, то .then() onReject функцию onReject, которая создаст пользователя.

user имеет основную учетную запись и может воспроизводить сеансы. В течение каждой сессии он получит нового player. Если user существует и пытается войти в систему, и его player зарегистрирован, он получит этого player обратно. Если player не существует, сервер создаст его для него.

Но у меня возникла проблема с logged переменной, которая говорит, что у пользователя есть зарегистрированный player. На второй строке функции findUser, я создаю переменную logged, и я пытаюсь вернуть его, так что я могу использовать на onResolve функции.

UserModel.find(
            { username: username, password: password},
            findUser ).then( 
             onResolve,
             onReject     );

По обещанию

      var onResolve = function (logged) {

          if (logged) { 
             //RETURN USER'S PLAYER
          } else {
             //CREATE USER'S PLAYER
          }

       }

На обещание отказаться

        var onReject = function () {
            userModel.save( function (err) {
                if (!err) {
                    //CREATE USER
                    //CREATE USER'S PLAYER
                }
            });
        });

Функция findUser

var findUser = function (err, data) {
    var logged = false;
    var userSearched = Q.defer();
    if (data.length) { //IF USER IS IN DATABASE
        logged = true;
        userSearched.resolve(logged);
    } else {
        userSearched.reject(logged);
    }

    return userSearched.promise;
};

Как я могу вернуть logged переменную из обещания использовать все, что мне нужно?

  • 0
    Вы не можете вернуться в logged за пределами обещания. Вместо этого верните обещание и используйте его там, где вам нужно logged .
  • 0
    Я возвращаю userSearched.promise. Как я могу получить доступ к зарегистрированному значению оттуда?
Показать ещё 1 комментарий
Теги:
mongoose
q

1 ответ

3
Лучший ответ

Если вы вернете значение из обработчика .then(), это значение станет выполненным значением обещания.

 var onResolve = function (logged) {

      if (logged) { 
         //RETURN USER'S PLAYER
      } else {
         //CREATE USER'S PLAYER
      }
      // ** add this **
      return logged;
   }

Затем вы можете использовать его в последующих обработчиках .then():

UserModel.find({ username: username, password: password}, findUser)
   .then( onResolve, onReject)
   .then(function(result) {
        // can access result here
    });

Если этот код находится внутри функции, вы можете вернуть обещание от UserModel.find():

function someFunc() {
    return UserModel.find({ username: username, password: password}, findUser)
       .then( onResolve, onReject);

}

И затем добавьте обработчик .then() к возвращенному обещанию.

someFunc().then(function(result) {
   // access result here
});

Или, в вашей функции findUser():

var findUser = function (err, data) {
    var userSearched = Q.defer();
    if (data.length) { //IF USER IS IN DATABASE
        userSearched.resolve(true);
    } else {
        userSearched.reject(false);
    }

    return userSearched.promise;
};

findUser.then(function(val) {
    // access resolved value here
}, function(err) {
    // access rejected reason here
});

Хотя findUser() не выглядит асинхронным, поэтому я не понимаю, почему вы вообще используете обещание. Кажется, вы можете просто вернуть true или false из функции напрямую.

  • 0
    Спасибо за ваш быстрый и полный ответ. Я пытаюсь это ;)

Ещё вопросы

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