2016-08-24 55 views
0

那麼最好的辦法,我已經減少了我的問題如下:的WebSocket - 太空,服務器響應

我有一個node.js服務器在2秒的間隔發送到我的WebSocket客戶端(瀏覽器)的響應。客戶機代碼來接收響應如下:

socket.onmessage = function (message) { 
    //display message 
}   

在大多數情況下,我可以在客戶端上的至少2秒收到響應。但是,有時由於網絡連接不良或服務器負載過高,我可能會收到來自服務器的突發響應。例如,而不是2s中的一個響應,我在6s中立即得到3個響應。

我該如何處理客戶的情況,以便保留至少2秒的延遲?

一個選項是將客戶端中的所有響應排隊,然後有一個定期檢查隊列的計時器。有沒有更好的辦法?

也是函數onmessage線程安全?也就是說,在代碼塊執行時,服務器端的新響應是否會被阻止?

回答

0

只有一個線程在瀏覽器上運行您的JavaScript(除非您使用工作者),所以它是線程安全的。

但是,事件循環將被阻止,直到onmessage處理程序返回,並且所有其他消息將在事件隊列中排隊等待處理。

當消息到達時,您可以將消息添加到隊列中,並且每隔2秒運行一次間隔以將項目從隊列中彈出並進行處理。

但是,一旦你得到延遲,突然間你會有永久的延遲,永遠不會離開,只會變大?也許你可以向我們提供更多的信息,爲什麼你需要在客戶端上2秒的時間間隔。這對我來說似乎是一個奇怪的要求

here的解決方案之一可能會提供速率限制排隊函數調用,您可以使用它來限制您的UI更新。請確保速度比服務器更快,以便它能趕上更大的隊列。

+0

客戶端更新服務器的每個響應的UI。用戶在短時間內看到變化很重要。 – Kamil

+0

我會推薦使用一個函數,如http://stackoverflow.com/questions/23072815/throttle-javascript-function-calls-but-with-queuing-dont-discard-calls,它允許一個函數是排隊和速度有限。但是,如果使用這種方法,請確保使延遲略低於服務器,以便能夠趕上 –