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如果您将该链接作为答案发布,我会将您标记为正确。这个链接回答了一个我也很好奇(但在这里没有问)的关于从异步操作返回值的问题。是的,它是正确的。未来发生的事情不会发生在现在。