2015-04-26 240 views
10

我試圖實現故障安全websocket包裝。我遇到的問題是處理超時錯誤。邏輯應該是:如果套接字在$ timeoutInMiliseconds期間未打開 - 必須關閉並重新打開$ N次。WebSocket連接超時

我正在寫這樣的東西。

var maxReconects = 0; 
var ws = new WebSocket(url); 
var onCloseHandler = function() { 
    if (maxReconects < N) { 
     maxReconects++; 
     // construct new Websocket 
     .... 
    } 
}; 
ws.onclose = onCloseHandler; 
var timeout = setTimeout(function() { 
       console.log("Socket connection timeout",ws.readyState); 
       timedOut = true; 
       ws.close(); <--- ws.readyState is 0 here 
       timedOut = false; 
},timeoutInMiliseconds); 

但問題是處理超時的WebSockets正確的方式 - 如果我試圖關閉未被連接插座我收到警告鉻:

「WebSocket連接到「WS://127.0.0.1:9010 /超時「失敗:WebSocket在連接建立之前關閉。」

我不知道如何避免它 - ws接口沒有中止功能。

我試過的其他aproach不是關閉套接字超時,如果它不連接,但只是標記爲不使用更多,關閉它,如果它收到readyState不止一個 - 但它可能會產生可能的泄漏,並複雜的這樣簡單的任務。

回答

2

您的timeout變量被分配給setTimeout(...函數,該函數被詞法調用。當您的代碼到達var onCloseHander = ...時,您的timeout函數已被調用。

對此的解決方案是使makeTimeout功能:

var makeTimeout = function (timeoutInMiliseconds) { 
    return window.setTimeout(function() { 
     // do stuff 
    }, timeoutInMiliseconds) 
}; 

var timeoutId = makeTimeout(100)將調用setTimeout功能,並設置timeoutId作爲超時ID的值。如果您需要取消此超時,可以通過調用window.clearTimeout(timeoutId)來完成。