Meteor服务器端更新/插入与客户端更新/插入

时间:2014-07-22 19:31:17

标签: javascript meteor

我对客户端与服务器上集合的更新/插入的优缺点有疑问。例如,假设我有一个当前玩家的方法,不再将他/她设置为当前玩家,然后创建一个新的当前玩家。

  Meteor.methods({
       currentPlayer : function () {
              var id = Player.findOne({current:true})._id;
              Player.update(id, {$set:{current:false}});
              Player.insert({current:true});
  ...

在服务器上执行此操作与在客户端执行完全相同的操作有什么好处:

  'click #add' : function () {
         var id = Player.findOne({current:true})._id;
         Player.update(id, {$set:{current:false}});
         Player.insert({current:true});
   ...

也许这两种技术都没有任何固有的重要差异或优势。但是,如果有,我想知道他们。感谢您的输入!

2 个答案:

答案 0 :(得分:3)

主要区别在于延迟补偿。

引擎盖Player.update/insert/remove,无论如何都使用了Meteor.call。不同之处在于它模拟了浏览器成功运行的结果。

所以说你的服务器位于世界另一端的某个地方,它有2-3秒的延迟。如果您使用Player.insert/update更新播放器,它会立即反映出它是否已插入并更新。这可以使UI感觉响应。

使用Meteor.methods等待服务器发送更新的记录,这意味着当您更新某些内容时,需要2-3秒才能反映出您的用户界面。

使用该方法可以确保以牺牲UI响应为代价将数据插入服务器。 (您也可以使用Player.insert& Player.update回调。

使用Meteor.methods,您还可以通过在客户端使用您希望运行的代码执行相同的Meteor.method来模拟此延迟补偿效果,以模拟延迟补偿。

有关如何在文档中执行此操作的详细信息,请参阅:http://docs.meteor.com/#meteor_methods

答案 1 :(得分:3)

我认为Akshat有一些很好的观点。如果在客户端和服务器上定义方法,基本上在延迟补偿方面没有太大区别。在我看来,使用方法有几个原因:

  • 操作只能在服务器上完成,否则会导致一些只在服务器上有意义的副作用(例如发送电子邮件)。

  • 您正在进行更新,执行更新的权限很复杂。例如,可能只有游戏的领导者可以更新玩家的某些属性。这样的情况在允许/拒绝规则中极难表达,但使用方法很容易编写。

就个人而言,我更喜欢在大型项目中使用方法,因为我发现当所有的更改都被迫通过一小组函数进行漏斗时,更容易推理出状态突变。

另一方面,如果您正在开发一个没有大量复杂更新规则的小型项目,那么直接收集突变可能会更快一些。