2015-04-26 42 views
10

Ben yedekli WebSocket sarmalayıcıyı uygulamak için çalışıyorum. Ve sahip olduğum problem, zaman aşımı hatalarıyla uğraşıyor. Mantık şu olmalıdır: $ timeoutInMiliseconds sırasında soket açılmamışsa - kapatılmalı ve $ N kez tekrar açılmalıdır.WebSocket Bağlantı zaman aşımı

Böyle bir şey yazıyorum.

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); 

Ama zaman aşımı işleyen sorun doğru yolu WebSockets - ı ı krom uyarı alırsınız bağlantısız soket kapatmaya çalışıyorum eğer: ws' olarak

"WebSocket bağlantısı: //127.0.0.1: 9010/zaman aşımı başarısız oldu: Bağlantı kurulmadan önce WebSocket kapalı. "

Ve bunu önlemek için nasıl hiçbir fikrim var - ws arayüzü hiçbir iptal işlevi vardır.

Denediğim diğer bir yaklaşım, bağlantısızsa zaman aşımındaki soketi kapatmak değil, daha fazla kullanılmadığı şekilde işaretlemeli ve birden fazla hazır ready alırsa kapatabilir - ancak olası sızıntılara neden olabilir ve karmaşıktır böyle basit bir görev.

cevap

2

Sizin timeout değişken lexically çağrılan ediliyor setTimeout(... fonksiyonu atanır. Zamanla kodunuzu var onCloseHander = ... sizin timeout işlevi zaten çalıştırılmış olan alır.

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

var timeoutId = makeTimeout(100)setTimeout işlevini çağırmak ve zaman aşımı İD değeri olarak timeoutId ayarlanır:

bu solüsyonu bir makeTimeout işlevi sağlamaktır. Bu zaman aşımını iptal etmeniz gerekiyorsa, bu window.clearTimeout(timeoutId) çağrılarak yapılabilir.

İlgili konular