流星自动运行比助手响应慢

时间:2016-07-24 15:31:12

标签: meteor

我已经与自动运行功能争夺了几天,在棋盘游戏中为两个玩家在画布上渲染元素。整个过程从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毫秒没有延迟。日志与游戏页面中的延迟相同。 由于我的理解不足,如果客户端知道对数据库进行了更改,则应该只运行自动运行,就像帮助程序只是运行一样。 我将非常感谢任何向我解释导致延迟的自动运行的行为,以及是否有办法取消它。

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用Meteor.call在客户端上调用方法时,有两件事并行发生:

  
      
  1. 客户端向服务器发送请求以安全地运行该方法   环境,就像AJAX请求一样可以模拟

  2.   
  3. 方法直接在客户端上运行以尝试预测结果   使用可用信息进行服务器调用。

  4.   

所以这就是你的Helper控制台在自动运行之前打印的原因。

  • 您的迷你mongo(客户端数据库)在根据第2点进行服务器数据更新之前得到更新。
  • 根据第1点,客户端向服务器发送请求,然后服务器更新服务器数据库。服务器将数据重新发布到客户端,并在您的情况下自动重新初始化。

所以关键是你的mini mongo(客户端数据库)在订阅准备好之前更新了。这就是你在自动运行之前让控制台登录助手的原因。

当您的服务器数据发送到客户端::

时,还会发生一件事
  

如果服务器的结果返回并与之一致   在客户端上模拟,一切都保持原样。如果结果就可以了   服务器不同于模拟的结果   客户端,修补UI以反映服务器的实际状态。