2015-05-29 52 views
4

(1)打開WebSocket連接。何時觸發WebSocket.onmessage?

var ws = new WebSocket(url); 

(2)當連接建立時,發送一個消息,它將觸發一個blob發送回來作爲響應。

ws.onopen = function() { 
    ws.send('1000000'); 
} 

(3)onmessage在響應開始或完成時觸發?

ws.onmessage = function() { 
    // Has the entire blob arrived or has the download just begun? 
} 
+0

收到時,或 - 完成時。如果在響應開始時調用它,我們需要做更多的工作來確定消息何時到達 - 這將使websocket降低槓桿而不是更高級的消息抽象。 – Mjh

+0

謝謝。你想把這個答案留下來,以便我可以投票嗎? –

+0

現在有一個更好的答案,所以隨時接受它,它應該幫助其他人有同樣的問題。 :) – Mjh

回答

3

W3C spec for the WebSocket API說,一個message事件應派出「當WebSocket的消息已收到」:

WebSocket的消息已收到類型和數據數據,用戶代理必須排隊任務以遵循以下步驟:

...

  • 事件是使用MessageEvent接口,與該事件類型message,這不起泡,不可取消,並且沒有缺省動作的事件。
  • ...

  • 調度事件WebSocket對象。
  • 要了解什麼是「時,已收到WebSocket的消息,」我們必須徵詢RFC 6455, "The WebSocket Protocol"意思。在的WebSockets,與會者發送消息中包含的一個或多個

    在成功的握手,客戶端和服務器的傳輸數據在本說明書中稱爲 概念性單元背面 來回「消息」。在線路上,消息由一個或多個幀組成。

    一旦理解的是,可以理解section 6 of RFC 6455,它定義「甲WebSocket的消息已被接收」這一短語:

    如果幀包括未分段 消息(第5.4節),它被說成是_A WebSocket消息已經是 Received_與type/type /和data/data /。如果幀是 分片消息的一部分,則後續數據幀的「應用數據」被連接以形成/ data /。當最後一個片段是 接收由FIN位(幀翅片)所示,它是說,_A WebSocket的消息已被Received_與數據/數據/ ...

    假設服務器端庫send方法將其參數視爲「消息」,該規範要求客戶端在發起message事件之前等待接收整個消息。

    服務器端API,允許流(例如,它不停的消息不完整,隱瞞了FIN位,直到某種finish方法被調用)不會導致客戶端,直到消息結束的觸發事件message