2016-04-22 70 views
1

我有一個流星應用程序,在用戶每持有一個按鈕時,它將按照1遞減一個帖子上的值。有許多按鈕,每個按鈕都應該隻影響自己。流星中的心跳方法

如果一個人按住按鈕,它將以每秒一次的速度下降。如果兩個人(在不同的客戶端),那麼每秒兩個。

在數據庫中更新的確切時刻是不必要的,只是客戶端應該每秒鐘看到計數器減少一個可變數量。

因此觸發我用下面的

Template.button.onRendered(function() { 
    var data = this.data; 

    Meteor.setInterval(function() { 
    if(isClicked) { 
     Meteor.call('heartbeat', data); 
    } 
    }, 1000); 
}); 

它調用客戶端/服務器方法

'heartbeat': function(button) { 
    Buttons.update({_id: button._id}, {$inc: {life: -1}}); 

    if(button.life <= 1) { 
    console.log('REMOVE DEAD BUTTONS'); 
    Buttons.remove({life: {$lte: 0}}); 
    } 
} 

並導致怪異活動時的等待時間發揮作用的方法。當我點擊一個按鈕時,其客戶端的生命在1hz時會下降。對於不同的客戶,其生活可能會停頓幾秒鐘,然後以2到4的大小遞減,直到它趕上。一旦它從服務器聽到它已被更新,它應該跳到新值,而不是逐漸減少。

但是,由於沒有任何代碼可以使其發展,所以我被認爲在遊戲中存在更根本性的錯誤。有三種狀態的按鈕經過:

Client A decrements value -> Server decrements value -> Client B reads value 

這個問題似乎客戶端A與服務器之間,所以也許設定的時間間隔來調用一個方法每一秒都在這裏,我需要解決的瓶頸,但我我不確定任何優雅的解決方案。如果不是發送每個更新,我採用了一種航位推算方法,併發送開始和結束,並在每秒之間插入服務器,這可能會緩解一些問題,但我不知道是否會遇到更多意想不到的問題。

是否存在一種明顯更好的方式來反應性地減少每個客戶對每個客戶的秒數?

回答

0

的另一種方法:

  1. 當用戶按壓按鈕(趕上這在模板的事件處理程序),使一個Meteor.call()到服務器,並在服務器遞減每一秒。
  2. 當用戶釋放該按鈕時,使另一個Meteor.call()取消遞減。您需要保留setInterval的句柄,以便您可以取消它。

這樣你就可以刪除客戶端 - >服務器進行更新的滯後。