Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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 Can';t传递超出Sequalize承诺范围的变量_Javascript_Sequelize.js - Fatal编程技术网

Javascript Can';t传递超出Sequalize承诺范围的变量

Javascript Can';t传递超出Sequalize承诺范围的变量,javascript,sequelize.js,Javascript,Sequelize.js,下面是一些代码来演示我的问题 'use strict'; module.exports = function(sequelize, DataTypes) { var Game = sequelize.define('Game', { ... }, { tableName: 'games', instanceMethods: { getState: function(userClass) { var currentGame = this;

下面是一些代码来演示我的问题

'use strict';

module.exports = function(sequelize, DataTypes) {
  var Game = sequelize.define('Game', { ... }, {
    tableName: 'games',
    instanceMethods: {
      getState: function(userClass) {
        var currentGame = this;
        var gameState = {};

        userClass.findOne({ where: { id: currentGame.challenger_user_id }}).then(
          function(challengerUser) {
            userClass.findOne({ where: { id: currentGame.recipient_user_id }}).then(
              function(recipientUser) {
                var turn;
                if (currentGame.turn_symbol == 'X') {
                  turn = { user: challengerUser, symbol: 'X' };
                } else {
                  turn = { user: recipientUser, symbol: 'O' };
                }

                gameState.game = currentGame;
                gameState.turn = turn;
                gameState.participants = [
                  { user: challengerUser, symbol: 'X' },
                  { user: recipientUser, symbol: 'O' }
                ];

                console.log(gameState);
                // Shows the object with the assigned values
              }
            );
          }
        );

        console.log(gameState)
        // Shows an empty object.
      }
    },
    classMethods: { ... }
  });
  return Game;
};
getState
函数中,我们首先声明一个名为
gameState
的空对象

然后我们找到两个用户——因此我们现在嵌套在两个范围内——并尝试为
gameState
变量赋值

在两个嵌套范围内执行console.log时,将显示该对象及其所有指定值

gameState
在两个嵌套作用域之外执行console.log时显示为空对象(赋值后)

有人能帮我解释一下我的错误吗

另外,这些嵌套作用域的正确术语是什么——它们是承诺吗


谢谢

好的,我在写完问题后马上想到了一个可能的解决方案

getState
函数末尾的
console.log(gameState)
返回null的原因是它与sequelize函数异步运行

换句话说,服务器需要0.05毫秒才能到达最后一个
控制台.log(gameState)
,但服务器需要0.15毫秒才能到达分配给它的值的位置


^正确吗?

什么是“Sequalize”?另请参见。@torazaburo如果您将该链接作为答案发布,我会将您标记为正确。这个链接回答了一个我也很好奇(但在这里没有问)的关于从异步操作返回值的问题。是的,它是正确的。未来发生的事情不会发生在现在。