如何从Q节点promise返回变量

How to return a variable from a Q Node promise?

本文关键字:promise 返回 变量 节点      更新时间:2023-09-26

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

现在,我正试图等到数据库显示尝试登录的用户是否已经有了帐户。我已经成功地做到了,所以如果用户不存在,.then()将调用创建用户的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
                }
            });
        });

函数查找用户

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

如何从promise返回logged变量以在需要的任何地方使用?

如果从.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():返回promise

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