以下是一些用于演示我的问题的代码。
'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
显示为空对象。
有人可以帮我解释一下我的错误吗?
此外,这些嵌套作用域的正确术语是什么 - 它们是否有承诺?
谢谢!
答案 0 :(得分:0)
好的,我在写完问题后立即想到了一个可能的解决方案。
console.log(gameState)
函数末尾的getState
返回null的原因是因为它与sequelize promises异步运行。
换句话说,服务器花了.05毫秒才能到达最后一个console.log(gameState)
,但是服务器花了.15毫秒来到达分配给它的值。
^这是正确的吗?