【问题标题】:How to return a variable from a Q Node promise?如何从 Q Node 承诺返回变量?
【发布时间】:2016-02-28 21:19:58
【问题描述】:

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

现在,我正在尝试等到数据库显示尝试登录的用户是否已经拥有一个帐户。我已经成功了,所以如果用户不存在,.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
                }
            });
        });

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

【问题讨论】:

  • 您不能将logged 退回到承诺之外。相反,返回承诺并在任何你需要的地方使用它logged
  • 我正在返回 userSearched.promise。如何从那里访问记录的值?
  • 查看 jfriend00 的回答

标签: javascript angularjs node.js mongoose q


【解决方案1】:

如果您从 .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);

}

然后,将.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

【讨论】:

  • 感谢您快速而完整的回答。我正在尝试。 ;)
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 2016-03-18
  • 2016-05-18
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2014-06-27
相关资源
最近更新 更多