如何为两个客户端调用Meteor方法一次?

时间:2016-02-23 13:34:21

标签: node.js meteor

我试图在流星上建立简单的游戏。当两个玩家在游戏中注册时,他们被重定向到游戏页面,并调用服务器方法。该方法只是用新游戏信息更新mongo集合并启动间隔,这将检查游戏结束时间:

//on client
Template.Game.onCreated(function() {
  Meteor.call('game', gameId, function(error) {
    if (error) {
      console.log(error);
    }
  });
});

//on server
Meteor.methods({
  'game': function(gameId) {
    var game = Games.findOne({
      _id: gameId
    });

    if (game) {
      //here update collection...

      var interval = Meteor.setInterval(function() {
        var now = Date.now();
        if (now >= game.endTime) {
          Meteor.clearInterval(interval);
        }
      }, 1000);
    }
  }
});

但问题是该方法运行两次并创建两个间隔。我知道Meteor为客户提出的每个请求创建了一条新光纤。事实证明,方法同时被调用,并且彼此独立地运行。我不知道是否有办法在一根光纤中运行两个请求)也许这会有所帮助,或者以其他方式解决这个问题,我是新手。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

注意:我没有尝试过,但我正在回答,以便您可以进行适当调整以使其正常工作。

根据您的问题和评论,最好使用observeChanges。在games.js集合文件或您声明Games集合的文件中,

var handle = Games.find({}).observeChanges({
     added: function (id, game) {
         //if first round is started immediately then create a setInterval here.
     },
     changed: function (id, fields) {
         //whenever round information is updated, you can set interval for the next round (if next round is available) here.
        // you can use "fields" parameter passed to this function
     }
});

只要将新记录插入added集合,就会运行Games回调。 id是新插入的游戏ID,game是新插入的游戏文档。 只要在updated集合中更新现有记录,就会运行Games回调。 id是已更新游戏的ID,fields游戏文档中新更新的字段。

有关进一步理解,请参阅流星文档:http://docs.meteor.com/#/full/observe_changes

希望它有所帮助。

答案 1 :(得分:-1)

我认为而不是创建模板上的调用方法 登录后执行操作 在客户端,用户将登录 在服务器端,用户进行身份验证并找到其他用户,这是免费的。因此,在找到用户之后,您可以创建游戏并将游戏传递给游戏数据到模板。