2015-04-26 197 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)来完成。