javascript - Meteor:如何确保在进入 Router.go 之前从方法中更新新的 session 变量?

标签 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 放入 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/

相关文章:

javascript - 道场中的时间戳日期时区问题

javascript - 为什么 HighStock 范围选择器中有禁用按钮?以及如何启用它们?

javascript - Laravel 5.6 - 使用 laravel-mix 拆分 vuejs 代码

mongodb - meteor .js : MongoDB bulk/batch Upsert

ubuntu - 在 ubuntu docker 中创建用户而不是使用 root

javascript - 给定属性的 meteor 事件选择器

javascript - 在函数内部调用函数时绑定(bind) this

javascript - docker-compose 仅​​运行我的 mongodb 服务器但不运行我的 js 文件

mongodb - 如何从 Loopback.io 内部获取 MongoDb 连接

node.js - 用于 mongodb 查询的 redis 缓存层以提高性能