我已经与自动运行功能争夺了几天,在棋盘游戏中为两个玩家在画布上渲染元素。整个过程从1名玩家进行移动到其他玩家可见时间过长。我设法通过优化我作为流星初学者编写的代码,并通过放置更新游戏的方法移动到(meteor.isServer)内来切割很多,因此它不会首先在移动制造商中运行该方法& #39; s客户端(它已经位于服务器的文件夹中)。 从服务器完成移动制作方法到服务器自动运行开始运行的那一刻(铬的延迟大约60毫秒,火狐的150(!))发生了一个超出我理解的时间延迟。我已经运行了一些测试来尝试缩小其发生原因的选项,最后一个是从不同的页面订阅游戏集合,并查看响应时间是否也很慢。这是代码:
Template.Watch.onCreated(function(){
this.subscribe('activeGames');
this.autorun(()=>{
if(this.subscriptionsReady()){
console.log(Games.findOne().turn + " " + (new Date).getTime());
}
});
});
Template.Watch.helpers({
games: ()=> {
console.log(Games.findOne().turn + " " + (new Date).getTime());
return Games.find({result: false});
}
});
现在,在客户端上,无论何时进行移动都会出现console.logs,奇怪的是助手的console.log在自动运行控制台之前50毫秒没有延迟。日志与游戏页面中的延迟相同。 由于我的理解不足,如果客户端知道对数据库进行了更改,则应该只运行自动运行,就像帮助程序只是运行一样。 我将非常感谢任何向我解释导致延迟的自动运行的行为,以及是否有办法取消它。
提前致谢!
答案 0 :(得分:1)
使用Meteor.call在客户端上调用方法时,有两件事并行发生:
客户端向服务器发送请求以安全地运行该方法 环境,就像AJAX请求一样可以模拟
- 醇>
方法直接在客户端上运行以尝试预测结果 使用可用信息进行服务器调用。
所以这就是你的Helper控制台在自动运行之前打印的原因。
所以关键是你的mini mongo(客户端数据库)在订阅准备好之前更新了。这就是你在自动运行之前让控制台登录助手的原因。
当您的服务器数据发送到客户端::
时,还会发生一件事如果服务器的结果返回并与之一致 在客户端上模拟,一切都保持原样。如果结果就可以了 服务器不同于模拟的结果 客户端,修补UI以反映服务器的实际状态。