无法在Sequalize承诺范围之外传递变量

时间:2016-01-10 16:51:44

标签: javascript sequelize.js

以下是一些用于演示我的问题的代码。

'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时,将显示包含所有已分配值的对象。

在两个嵌套作用域之外执行console.log时(在分配值之后),

gameState显示为空对象。

有人可以帮我解释一下我的错误吗?

此外,这些嵌套作用域的正确术语是什么 - 它们是否有承诺?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

console.log(gameState)函数末尾的getState返回null的原因是因为它与sequ​​elize promises异步运行。

换句话说,服务器花了.05毫秒才能到达最后一个console.log(gameState),但是服务器花了.15毫秒来到达分配给它的值。

^这是正确的吗?