这是我所拥有的一个场景,无法找到如何避免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,则观察只会运行一次。
答案 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
}
});
内运行。