如何从Q Node promise中返回变量?

时间:2015-11-25 22:21:34

标签: javascript angularjs node.js mongoose q

我有一个使用Angular,Express,Mongo和Node的学习游戏。我现在正在学习如何使用promises,所以我可以等到一些事情完成后再开始其他事情。

现在,我正在尝试等到数据库说出用户是否已尝试登录已有帐户。我已经成功了,所以如果用户不存在,.then()将调用将创建用户的onReject函数。

user有一个主帐户,可以播放会话。在每个会话中,他将收到一个新的player。如果user存在并尝试登录并且记录了他的player,他将收到player。如果player不存在,服务器将为他创建一个。

但是,我遇到了变量logged的问题,该问题表明用户是否已记录player。在函数findUser的第二行,我正在创建一个名为logged的变量,我正在尝试将其返回,因此我可以使用onResolve函数。

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

On Promise resolve

      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变量以便在我需要的任何地方使用?

1 个答案:

答案 0 :(得分:3)

如果从.then()处理程序返回值,则该值将成为promise的已实现值。

 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);

}

然后,在返回的promise中添加.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()看起来并不异步,所以我真的不明白你为什么要使用它的承诺。您似乎可以直接从函数返回truefalse