如何避免使用多个Meteor进程多次触发obserseChanges

时间:2014-09-09 08:39:52

标签: javascript node.js meteor

这是我所拥有的一个场景,无法找到如何避免observeChanges多次触发的明确答案。

我让这段代码听取了玩家的命令,并触发一个事件来触发AI来模拟一个动作:

// Client-side
Deps.autorun(function() {
    var query = Games.find({
        "playerOne": "PlayerOne",
        "playerTwo": "Computer"
    });
    var handle = query.observeChanges({
        changed: function (id, fields) {
            // AI makes a move
            if (fields.playerTurn == "ComputerTurn" && fields.lastplay)
            // lastplay is a timestamp after player has played a turn
                Meteor.call("playComputerTurn", id);
        }
    });
});

//Server-side
Meteor.methods({
    'playComputerTurn': function(id) {
        // long code to simulate a computer turn
     }
});

使用单个Meteor流程,事件只会触发一次,但是运行多个进程,我似乎没有选择让observeChanges忽略事件,如果进程已经触发一次。

EDIT 更清楚,在服务器重启的情况下,事件将需要重新运行,并且在服务器繁重的计算期间,玩家不应该停止&#34; <#34;。

我是否需要使用Fiber in queue包装服务器端事件,或者我可能在这里错过了一些简单的事情,有人可以帮忙或建议吗?

P.S。如果只是在服务器端放置observeChanges,则观察只会运行一次。

1 个答案:

答案 0 :(得分:0)

您可以采取多种方法。您可以使用更改update的{​​{1}}回调来调用该方法。那么你根本不需要观察者。

playerTurn

或者,你可以在玩家轮到你的方法中做所有事情。

// client
Games.update(gameId, {$set: {playerTurn: "ComputerTurn"}}, function (err) {
  if (!err) {
    Meteor.call("playComputerTurn", gameId);
  }
});

另请注意,如果您使用观察者,则除非选择器处于被动状态,否则不需要在// server Meteor.methods({ 'playComputerTurn': function(gameId) { var game = Games.findOne(gameId, ...); // make sure this.id is the current player // make sure it's this player's turn // play turn, set playerTurn, lastplay, etc. // long code to simulate a computer turn } }); 内运行。