Meteor:如何确保在转到Router.go之前从方法更新新的会话变量?

时间:2014-09-10 22:41:52

标签: javascript mongodb meteor

我有一种方法,用户可以加入现有游戏或创建新游戏。此外,相应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并将其放入会话变量中。从那里路由器转到提供的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});
    }
});

但是,会话变量保存为OLD会话变量,然后路由器转到错误的地址。以下是上面的控制台:

creating a new game, none available 
yKrSeeAfMh4ppXWJP 
Object {id: "AKXYbWcdJWfaXfo8C"}

这是地址和实际游戏ID

http://localhost:3000/games/yKrSeeAfMh4ppXWJP
Current Game ID: AKXYbWcdJWfaXfo8C

如何确保使用流星法返回的新ID更新var gameId,然后再继续路线?

1 个答案:

答案 0 :(得分:1)

您尝试在点击后立即重定向用户,而无需等待来自服务器的数据。 在收到来自服务器的信息后重定向用户 - >内部回调。

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});
        });
    }
});