如何避免纠缠通过多个Meteor进程多次触发更改
How to avoid obserseChanges firing more than once with multiple Meteor processes
这是我遇到的一个场景,无法找到如何避免观察到多次触发更改的明确答案。
我有这样的代码,听玩家的命令,并触发一个事件来触发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为了更清楚,在服务器重新启动的情况下需要重新运行事件,并且在服务器繁重的计算过程中,播放器不应"停止"。
我是否需要用队列中的光纤来包装服务器端事件,或者我可能错过了一些简单的东西,有人能帮忙或建议吗?
附言:如果只是将observeChanges放在服务器端,则observe将只运行一次。
您可以采取多种方法。您可以使用更改playerTurn
的update
回调来调用该方法。那你就根本不需要观察员了。
// 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
}
});
还要注意,如果使用观察器,它不需要在autorun
内部运行,除非选择器是被动的。
相关文章:
- 节点分叉子进程并获取它's错误
- 子进程未接收消息
- 我想放慢html中进程栏的速度
- 派生进程的stdout在管道传输时工作异常
- 定时Ajax进程在用户离开页面后继续
- 事件循环的MEAN.JS setInterval进程(从另一个服务器获取数据)
- 从已经运行的进程打开chrome扩展的背景页
- 用于本地主机上进程间通信的Javascript中的UDP
- AWS Lambda上的权限问题,可以't派生子进程
- PM2 在运行时更改集群进程大小
- 不同进程之间共享Node.js环境
- 链接CSS、Javascript和HTML进程失败
- 如何通过子进程连接Java应用程序后在node.js中编写文件
- Node.js使用派生两个子进程,然后两个子进程如何相互交换
- jar文件的后台进程,如何在进程结束时异步通知我
- Meteor - 如何同时运行多个服务器进程
- 节点.js子进程中的运行函数
- 是否可以从在Firefox或IE的网页中运行的Javascript启动Windows进程
- 通过进程使用 NodeJS 全局事件是个好主意吗?
- 如何避免纠缠通过多个Meteor进程多次触发更改