0
我們正在構建一個消息系統,可以直接與用戶聊天。由於我們使用的是Rails3,並且4的升級即將到來,所以我們將使用輪詢而不是流式處理。PollingPattern丟失了部分數據
我們遇到了問題,可能是由設計模式造成的。
function OurChat() {
this.timestamp = null
var self = this
this.init = function() {
self.timestamp = (new Date().getTime()).toString().substr(0, 10) //rails conform
於是我們使輪詢,其中頻率是5000毫秒
this.polling = function() {
$.getJSON("/chat.json?t=" + self.timestamp, function(data) {
self.set_timestamp()
self.update_friends(data.friends)
self.update_messages(data.messages)
window.setTimeout(function() {
self.polling();
}, self.frequency);
});
}
如果我們撰寫郵件,我們將請求發送到服務器,並顯示與所述類消息「.temporary」
當我們輪詢時,我們將消息與臨時類一起刪除,並將消息添加到我們的消息列表中。 這裏的問題是開始。
例
last_polling_timestamp is **1000**
[...4.5 seconds are gone...]
-> user sends a message -> request takes whatever it takes
[..5seconds are gone..]
-> poling is looking for messages > timestamp **1000**
-> _blank result_
[..little bit later..]
-> message is created by server, timestamp **1001**
[..5seconds are later..]
-> poling is looking for messages > timestamp **1005**
-> _blank result_
我們怎麼解決這個問題? 我最早的想法是發回每條消息的ID,將ID保存在.message [data-id]處。然後在過去總是10秒內輪詢(以便每個請求應該已經存在)。檢查所有消息,並查看它是否已經在我的domtree中。如果沒有 - >插入它(在正確的oder中)。 是更好的方法嗎?