2014-04-14 9 views
23

Wenn meine Seite geladen wird, versuche ich send eine Nachricht an den Server, um eine Verbindung herzustellen, aber es funktioniert nicht. Dieses Skript-Block ist in der Nähe der Spitze meiner Datei:Uncaught InvalidStateError: Fehler beim Ausführen von 'send' auf 'WebSocket': Immer noch im CONNECTING-Status

var connection = new WrapperWS(); 
connection.ident(); 
// var autoIdent = window.addEventListener('load', connection.ident(), false); 

die meiste Zeit, sehe ich die Fehler im Titel:

Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state

Also habe ich die Ausnahme catch versucht, wie Sie sehen können unten, aber jetzt scheint es InvalidStateError ist nicht definiert und das erzeugt eine ReferenceError.

Hier ist das Wrapper-Objekt für meine websocket Verbindung:

// Define WrapperWS 

function WrapperWS() { 
    if ("WebSocket" in window) { 
     var ws = new WebSocket("ws://server:8000/"); 
     var self = this; 

     ws.onopen = function() { 
      console.log("Opening a connection..."); 
      window.identified = false; 
     }; 
     ws.onclose = function (evt) { 
      console.log("I'm sorry. Bye!"); 
     }; 
     ws.onmessage = function (evt) { 
      // handle messages here 
     }; 
     ws.onerror = function (evt) { 
      console.log("ERR: " + evt.data); 
     }; 

     this.write = function() { 
      if (!window.identified) { 
       connection.ident(); 
       console.debug("Wasn't identified earlier. It is now."); 
      } 
      ws.send(theText.value); 
     }; 

     this.ident = function() { 
      var session = "Test"; 
      try { 
       ws.send(session); 
      } catch (error) { 
       if (error instanceof InvalidStateError) { 
        // possibly still 'CONNECTING' 
        if (ws.readyState !== 1) { 
         var waitSend = setInterval(ws.send(session), 1000); 
        } 
       } 
      } 
     window.identified = true; 
      theText.value = "Hello!"; 
      say.click(); 
      theText.disabled = false; 
     }; 

    }; 

} 

Ich teste Chromium auf Ubuntu.

Antwort

20

Sie können Nachrichten über einen Proxy-Funktion senden, die für wartet die Readystate 1.

this.send = function (message, callback) { 
    this.waitForConnection(function() { 
     ws.send(message); 
     if (typeof callback !== 'undefined') { 
      callback(); 
     } 
    }, 1000); 
}; 

this.waitForConnection = function (callback, interval) { 
    if (ws.readyState === 1) { 
     callback(); 
    } else { 
     var that = this; 
     // optional: implement backoff for interval here 
     setTimeout(function() { 
      that.waitForConnection(callback, interval); 
     }, interval); 
    } 
}; 

Dann this.send anstelle von ws.send verwenden zu sein, und den Code setzen, die anschließend in einem Rückruf ausgeführt werden soll:

this.ident = function() { 
    var session = "Test"; 
    this.send(session, function() { 
     window.identified = true; 
     theText.value = "Hello!"; 
     say.click(); 
     theText.disabled = false; 
    }); 
}; 

Für etwas stromlinienförmiger könnten Sie in promises suchen.

+3

Ich denke, vergessen Sie 'interval' Parameter in' that.waitForConnection (Rückruf, Intervall) 'zu liefern mit, wenn Sie es nennen innen' setTimeout'. –

Verwandte Themen