2015-06-18 69 views
0

有沒有辦法只根據需要發佈集合的更新? (例如,每5秒發送更新一次?)按需發佈流星?

我發佈了排行榜,它顯示了遊戲中排名前50位的玩家(得分最高)。對用戶點的更新頻繁發生,所以排行榜的變化很頻繁(每隔1-5秒)。每分鐘左右,服務器都會在forEach循環中更新約100個用戶的點數。問題在於,在所有100個元素都被更新之前,發佈方法立即開始更新。這會產生一個痛苦的性能問題(多次向所有用戶發佈更新)...

有沒有辦法在發佈完所有更新之前進行發佈?或者只是每5秒更新一次發佈的數據而不是立即更新?

感謝您的幫助! :)

+0

聽起來類似於我最近閱讀的文章:http://tomkelsey.co.uk/reining-in-the-reactivity-with-meteor/也許會幫助:) –

+0

第二次閱讀您的問題後,您的前提是錯誤的。您首先要問的是如何「按需」(從客戶端)執行,然後以「每5秒」爲例,由服務器控制。請把你的問題縮小到一個**精確的**問題。 –

回答

0

文章http://tomkelsey.co.uk/reining-in-the-reactivity-with-meteor/討論了這個確切的問題,筆者「使用的流星相結合的方法和一般的發佈/訂閱的方式。一個簡單的例子載列如下。

在主頁的onCreated方法我要求項_ids的排序後的數組從服務器,並將它們保存到一個會話變量稱爲itemIds:

Meteor.call('getItemIds', function(err, res) { 
    Session.set('itemIds', res); 
}); 

在服務器上,該方法被定義爲:

Meteor.methods({ 
    getItemIds: function() { 
    return Items.find({}, {fields: {_id: 1}, sort: 
    {rank:1}}).fetch(); 
    } 
}); 

然後我看的任何改變itemIds會話變量並(重新)因此訂閱:

var self = this; 
self.autorun(function() { 
    self.subscribe('itemsById', Session.get('itemIds')); 
}); 

在服務器上,公佈如下:在

Meteor.publish('itemsById', function(itemIds) { 
    return Items.find({}, {_id: {$in: itemIds}}); 
}); 

我的模板迭代itemIds數組而不是Items集合遊標。這意味着項目的順序保持不變。

對於itemIds中的每個_id,我可以做一個Items.find(_id) - 數據將位於我們的itemsById訂閱的客戶端Items集合中。

瞧我們,直到刷新頁面,將保留其順序反應的項目列表。」

聽起來像它可以適用於你:)

1

創建自定義的出版物,並採取控制!

var pubsHandlers = []; 

Meteor.publish('totalScore', function() { 
    this.added('someClientCollection', 'totalScoreId', { 
    totalScore : someGetTotalScoreFunction() 
    }); 
    pubsHandlers.push(this); //Maaaaybe not the cleanest thing to do. 
    this.ready(); 
}); 

Meteor.setInterval(function updateScores() { 
    var newTotalScore = somegetTotalScoreFunction() 
    pubsHandlers.forEach(function(pubHandler) { 
    pubHandler.changed('someClientCollection', 'totalScoreId', { 
     totalScore : newTotalScore 
    }); 
}, 5000); //Each 5 seconds, update everyone 

所以這裏發生的事情:

  1. 出版在自定義這樣,通過adding的文件給我們的出版,
  2. 記住了進一步的更新發布處理程序,
  3. 在稍後的時間(此處爲interval),使用記憶處理程序update文件。

主要好處是保持服務器完全控制發佈及其更新。
主要缺點是使用push(this)。這不一定是壞的,但它看起來如此可惡醜陋......

+0

我第一次在Meteor Devshop視頻中看到了這種模式。如果您碰巧知道它是哪個視頻,請隨時在評論或編輯中添加鏈接。 –