2012-10-27 62 views
0

我有象下面這樣的代碼信息:的WebSocket發送後,纔得到循環完成

var ws = new WebSocket("ws://localhost"); 
ws.onopen = function() { 
    // Long running loop 
    for (var i = 0; i < 1000000; i++) { 
     ws.send(i); 
     console.log(i); 
    } 
}; 

服務器只接收郵件(或我相信客戶端只開始發送消息)的循環被完成之後。這是爲什麼?

+1

可能的。嘗試通過window.timeout引入延遲。 – oberstet

回答

2

與頁面執行的一些領域是:

  • 的JavaScript
  • DOM渲染
  • 網絡

我沒一會兒測試這一點,但我假設它仍然是這樣的,如果你執行一個函數(或者在一個範圍內運行代碼),那麼如果你打電話來更新DOM或者發出一個網絡請求,直到當前範圍存在纔會發生。

例如

function doSomething() { 
    document.body.innerHTML += 'hello'; 
    var ws = new WebSocket('ws://my-websocket-endpoint.com'); 
    ws.onopen = function() { alert('awesome!'); }; 
} 

doSomething(); 

在下文中上面的代碼會發生:

  • doSomething執行和內部代碼運行。
  • doSomething回報和範圍的變化
  • 「你好」,然後出現在DOM的瀏覽器提供的UI線程有機會運行任何掛起更新
  • 的WebSocket連接是由
  • 這可能需要一段時間直到alert發生火災。

具體查看WebSocket示例。如果您考慮在創建WebSocket實例後添加事件處理程序的事實,這意味着只要我們調用構造函數就不會發生連接。只有在當前執行範圍完成時才嘗試連接。我不能100%確認這一點,但在實現範圍完成之前,WebSocket.send函數實際上發送任何數據的可能性很小,例如,

var ws = new WebSocket('ws://my-websocket-endpoint.com'); 

function sendStuff() { 
    for(var i = 0; i < 10000; ++i) { 
    ws.send(i); 
    } 
} 

// Assume we are connected 
sendStuff(); 

在上面的代碼我希望:

  • sendStuff被調用,運行循環和退出
  • 瀏覽器,然後用其他任何的待處理,其中包括網絡活動處理。這包括實際發送數據
1

它不回答你的問題,但它的值得注意的是你的代碼看起來不正確。您的new WebSocket呼叫將啓動與服務器的異步握手。完成後,您在websocket上註冊的任何onopen回調將會運行。只有在這個時候,您才能撥打ws.send,並期望服務器收到您的信息。

因爲循環執行速度非常快,數據緩衝和發送異步瀏覽器的網絡線程在後臺完成然後,您可以返工您的例子

var ws = new WebSocket("ws://localhost"); 
ws.onopen = function() { 
    for (var i = 0; i < 1000000; i++) { 
     ws.send(i); 
     console.log(i); 
    } 
}; 
+0

僅僅爲了舉例而已,現在它已經得到糾正。感謝您指出了這一點。 – Vishal

相關問題