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

Javascript Meteor服务器端更新/插入与客户端更新/插入,javascript,meteor,Javascript,Meteor,我有一个关于在客户机和服务器上更新/插入集合的优点和缺点的问题。例如,假设我有一个方法,该方法接受当前玩家,将他/她设置为不再是当前玩家,然后创建一个新的当前玩家 Meteor.methods({ currentPlayer : function () { var id = Player.findOne({current:true})._id; Player.update(id, {$set:{current:false}

我有一个关于在客户机和服务器上更新/插入集合的优点和缺点的问题。例如,假设我有一个方法,该方法接受当前玩家,将他/她设置为不再是当前玩家,然后创建一个新的当前玩家

  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});
   ...

也许这两种技术都没有本质上重要的区别或优势。然而,如果有,我想知道他们。谢谢你的意见

主要区别在于延迟补偿

在引擎盖下,
Player.update/insert/remove
,使用了一个
Meteor.call
。不同之处在于,它模拟了浏览器上成功操作的结果

因此,假设您的服务器位于世界的另一端,有2-3秒的延迟。如果您使用
player.insert/update
更新播放机,它将立即反映为已插入并更新。这可以让UI感觉到响应性

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

使用该方法,您可以确保数据已插入到服务器上,但代价是UI响应。(您也可以使用
Player.insert
Player.update
回调进行此操作

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


在文档中有更多关于如何执行此操作的详细信息:

主要区别在于延迟补偿

在引擎盖下,
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
来模拟相同的延迟补偿效果


在文档中有更多关于如何执行此操作的细节:

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

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

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

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


另一方面,如果您正在处理一个没有太多复杂更新规则的较小项目,那么编写直接收集变体可能会快一点。

我认为Akshat有一些优点。如果您在客户端和服务器上都定义了该方法,那么在延迟补偿方面基本上没有太大区别在我看来,使用一种方法有两个原因:

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

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

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

另一方面,如果您正在处理一个没有太多复杂更新规则的较小项目,那么编写直接收集变体可能会快一点