簡體   English   中英

流星服務器端更新/插入與客戶端更新/插入

[英]Meteor server-side update/insert vs client side update/insert

我對在客戶端與服務器上更新/插入集合的優缺點有疑問。 例如,說我有一個方法,該方法采用一個當前玩家,不再將其設置為當前玩家,然后創建一個新的當前玩家。

  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/removePlayer.update/insert/remove仍然使用Meteor.call 區別在於,它會在瀏覽器成功運行之前模擬其成功運行的結果。

因此,假設您的服務器位於世界另一端的某個地方,它的延遲為2-3秒。 如果使用Player.insert/update更新播放器,它將立即反映出來,就好像它已插入並更新一樣。 這可以使UI響應。

使用Meteor.methods等待服務器發送更新的記錄,這意味着當您更新某些內容時,將需要2-3秒的時間才能反映在用戶界面上。

使用方法可以確保以UI響應為代價將數據插入到服務器上。 (您也可以Player.insert使用Player.insertPlayer.update回調。

使用Meteor.methods您還可以通過在客戶端使用要運行的模擬Meteor.method的代碼來模擬此延遲補償效果,以模擬延遲補償。

有關如何執行此操作的詳細信息,請參見文檔: http//docs.meteor.com/#meteor_methods

我認為Akshat有一些優點。 如果在客戶端和服務器上都定義了方法,則基本上在延遲補償方面沒有太多差異。 我認為,使用方法有兩個原因:

  • 該操作只能在服務器上完成,否則會導致一些副作用,僅在服務器上才有意義(例如,發送電子郵件)。

  • 您正在執行更新,並且執行更新的權限很復雜。 例如,也許只有游戲的領導者才能更新玩家的某些屬性。 這樣的情況很難用允許/拒絕規則表達,但是很容易使用方法編寫。

就我個人而言,我更喜歡在大型項目中使用方法,因為當所有更改都被迫通過一小組函數集中時,我發現更容易推斷狀態突變。

另一方面,如果您正在處理一個沒有很多復雜更新規則的較小項目,則直接收集變量的編寫可能會更快一些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM