meteor收集更新后的服务器端计时器

meteor收集更新后的服务器端计时器,meteor,timer,meteor-collections,meteor-collection-hooks,Meteor,Timer,Meteor Collections,Meteor Collection Hooks,我目前正在开发一个简单的实时多人游戏,我一直坚持使用定时器逻辑 当一个游戏中有足够的玩家时,游戏的状态设置为“已启动”,从那里我想启动一个10秒计时器,并向所有客户端显示它 我的想法是使用集合挂钩并在集合更新后调用setTimeout。但我真的不知道怎么做,也不知道这是否是最好的解决方案 也许我应该使用cron而不是计时器 我将使用以下逻辑: 集合上的before.update hook更新状态以开始使用 在钩子中为玩家足够的日期设置日期时间=>将此数据保存在游戏集合中 Game.before

我目前正在开发一个简单的实时多人游戏,我一直坚持使用定时器逻辑

当一个游戏中有足够的玩家时,游戏的状态设置为“已启动”,从那里我想启动一个10秒计时器,并向所有客户端显示它

我的想法是使用集合挂钩并在集合更新后调用setTimeout。但我真的不知道怎么做,也不知道这是否是最好的解决方案


也许我应该使用cron而不是计时器

我将使用以下逻辑:

  • 集合上的before.update hook更新状态以开始使用
  • 在钩子中为玩家足够的日期设置日期时间=>将此数据保存在游戏集合中

    Game.before.update(function (userId, doc, fieldNames, modifier, options) {
        if (modifier && modifier.$set && modifier.$set.nb_of_players > 10) {
            modifier.$set.status = "Started";
            modifier.$set.startingTime = new Date();
        }
    });
    
  • 使用助手动态计算要在客户端上显示的时间,这里是反应式时间显示的基本工作示例,您需要改进以获得倒计时:

    Template.Home.helpers({
        time: function () {
            return Template.instance().date.get();
        },
    });
    
    
    Template.Home.onCreated(function () {
        var self = Template.instance();
        self.date = new ReactiveVar();
        Meteor.setInterval(function () {
            self.date.set(new Date());
        }, 1);
    
    });
    
  • 使用setTimeout在10秒后实际执行某些操作-这应该在设置游戏开始后调用。在自动运行中检查值,或在Meteor.call的回调函数中使用:

    Meteor.setTimeout(function(){
        Meteor.call("launchAction", {data:data}, function (error, result) {
            if (error){
                console.error(error);
            } else {
    
            }
        });
    }, 10);
    
    我还建议使用来实际操作日期和时间


你好,维克多,非常感谢您的回复!因此,如果我理解正确,我应该使用定义的日期显示计时器,我可能可以将im存储在游戏集合中?我还应该在更新前挂钩中写入Meteor.setTimeout吗?我有一个错误,说不可能在模拟中使用计时器。@ElPoisen,我用更多的代码示例和细节编辑了我的答案,非常感谢您抽出时间,我非常感谢!我想我现在明白了。