我有一种方法,用户可以加入现有游戏或创建新游戏。此外,相应 id 的 id 存储在一个对象中并按如下方式返回:
Meteor.methods({
newGame: function(gameQuestions) {
var user = Meteor.user();
var gameWaiting = GameCollection.findOne({players: {$size: 1}, active: false, current: true});
var result = {};
if (!gameWaiting) {
var gameId = GameCollection.insert
//.....
result.id = gameId;
} else {
if (_.contains(gameWaiting.players, user._id))
//.....
result.id = gameWaiting._id;
} else {
//......
result.id = gameWaiting._id;
}
}
return result
},
在客户端,我有一个按钮,用户可以在其中单击新游戏,然后将方法返回的 ID 放入 session 变量中。路由器从那里转到提供的 ID:
Template.loggedIn.events({
"click #newGame": function() {
var gameQuestions = Questions.find().fetch();
Meteor.call('newGame', gameQuestions, function(err, data) {
if (err)
console.log(err);
Session.set('uniqueId', data);
console.log(data)
});
var gameId = Session.get('uniqueId').id;
console.log(gameId);
Router.go('gamePage', {_id: gameId});
}
});
但是, session 变量被保存为 OLD session 变量,然后路由器会转到错误的地址。这是上面的控制台:
creating a new game, none available
yKrSeeAfMh4ppXWJP
Object {id: "AKXYbWcdJWfaXfo8C"}
这里是地址和实际的游戏ID
http://localhost:3000/games/yKrSeeAfMh4ppXWJP
Current Game ID: AKXYbWcdJWfaXfo8C
在继续执行路线之前,如何确保 var gameId 已更新为从 Meteor 方法返回的新 Id?
最佳答案
您正在尝试在用户点击后立即重定向用户,而不等待来自服务器的数据。 收到来自服务器的信息后重定向用户 -> 内部回调。
Template.loggedIn.events({
"click #newGame": function() {
var gameQuestions = Questions.find().fetch();
Meteor.call('newGame', gameQuestions, function(err, data) {
if (err)
console.log(err);
Session.set('uniqueId', data);
console.log(data)
var gameId = Session.get('uniqueId').id;
Router.go('gamePage', {_id: gameId});
});
}
});
关于javascript - Meteor:如何确保在进入 Router.go 之前从方法中更新新的 session 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25776248/