我对客户端与服务器上集合的更新/插入的优缺点有疑问。例如,假设我有一个当前玩家的方法,不再将他/她设置为当前玩家,然后创建一个新的当前玩家。
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});
...
也许这两种技术都没有任何固有的重要差异或优势。但是,如果有,我想知道他们。感谢您的输入!
答案 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有一些很好的观点。如果在客户端和服务器上定义方法,基本上在延迟补偿方面没有太大区别。在我看来,使用方法有几个原因:
操作只能在服务器上完成,否则会导致一些只在服务器上有意义的副作用(例如发送电子邮件)。
您正在进行更新,执行更新的权限很复杂。例如,可能只有游戏的领导者可以更新玩家的某些属性。这样的情况在允许/拒绝规则中极难表达,但使用方法很容易编写。
就个人而言,我更喜欢在大型项目中使用方法,因为我发现当所有的更改都被迫通过一小组函数进行漏斗时,更容易推理出状态突变。
另一方面,如果您正在开发一个没有大量复杂更新规则的小型项目,那么直接收集突变可能会更快一些。