Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从Q节点返回变量?_Javascript_Angularjs_Node.js_Mongoose_Q - Fatal编程技术网

Javascript 如何从Q节点返回变量?

Javascript 如何从Q节点返回变量?,javascript,angularjs,node.js,mongoose,q,Javascript,Angularjs,Node.js,Mongoose,Q,我有一个使用Angular、Express、Mongo和Node的学习游戏。我现在正在学习如何使用承诺,所以我可以等到事情完成后再开始其他事情 现在,我正在尝试等待,直到数据库显示尝试登录的用户是否已经拥有帐户。我已经成功了,因此如果用户不存在,.then()将调用创建用户的onReject函数 用户拥有主帐户,可以播放会话。在每个会话中,他将收到一个新的播放器。如果用户存在并尝试登录,并且他的播放器被记录,他将收到该播放器的回复。如果播放器不存在,服务器将为他创建一个 但是,变量logged有

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

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

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

但是,变量
logged
有一个问题,即如果用户有一个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;
};

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

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

 var onResolve = function (logged) {

      if (logged) { 
         //RETURN USER'S PLAYER
      } else {
         //CREATE USER'S PLAYER
      }
      // ** add this **
      return logged;
   }
然后可以在后续的
处理程序中使用它。然后()
处理程序:

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

如果此代码在函数中,则可以从
UserModel.find()
返回承诺:

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

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

 var onResolve = function (logged) {

      if (logged) { 
         //RETURN USER'S PLAYER
      } else {
         //CREATE USER'S PLAYER
      }
      // ** add this **
      return logged;
   }
然后可以在后续的
处理程序中使用它。然后()
处理程序:

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

如果此代码在函数中,则可以从
UserModel.find()
返回承诺:

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

您不能将
记录的
返回到承诺之外。相反,返回承诺,并在需要的任何地方使用它
记录的
。我将返回userSearched.promise。如何从那里访问记录的值?请参阅jfriend00的回答您不能将
记录的
返回到承诺之外。相反,返回承诺,并在需要的任何地方使用它
记录的
。我将返回userSearched.promise。如何从那里访问记录的值?请参阅jfriend00的回答谢谢您快速完整的回答。我正在尝试谢谢你快速完整的回答。我正在尝试