如何 return 来自 Q Node promise 的变量?

How to return a variable from a Q Node promise?

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

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

user 有主账号可以玩session。在每个会话中,他将收到一个新的 player。如果 user 存在并尝试登录并且他的 player 被记录,他将收到 player 返回。如果player不存在,服务器会为他创建一个

但是,我遇到了变量 logged 的问题,它表示用户是否已登录 player。在函数 findUser 的第二行,我正在创建一个名为 logged 的变量,我正在尝试 return 它,因此我可以在 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
                }
            });
        });

函数查找用户

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

我如何return 承诺中的 logged 变量在我需要的任何地方使用?

如果您 return 来自 .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
    });

如果这段代码在一个函数中,那么你可以return来自UserModel.find()的承诺:

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

}

然后,将 .then() 处理程序添加到 returned promise。

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() 看起来不是异步的,所以我真的不明白你为什么要对它使用 promise。看来您可以直接从函数中 return truefalse