0

Je construis une extension Chrome qui se connecte aux Websockets et récupère des données. J'essaye de construire un moyen que l'utilisateur choisisse une option de popup.html et change à quel websocket la connexion sera faite. Cela fonctionne bien.Comment fermer correctement les Websockets

Mon problème est qu'après avoir sélectionné une option, la nouvelle connexion est faite à cette socket Web mais la précédente continue de retourner des données. Je voudrais fermer cette connexion précédente avant d'en ouvrir une nouvelle.

popup.js (sur le changement RadioButton stocke la nouvelle valeur)

$(function() { 
     $("input:radio[name=exc]").change(function() { 
      chrome.storage.local.set({'checked':this.value}, function() { 
      }); 
     }); 
    }); 

update.js (recevoir de nouveaux RadioButton sélectionné, je suis en train de fermer la websocket preivous)

chrome.storage.onChanged.addListener(function(changes, namespace) { 
    chrome.storage.local.get("checked", function(data) { 
     if(data.checked == "foo") { 
      var ws = new WebSocket('wss://api.foo.com/ws'); 
      ws.onopen = function() { 
       ws.send(JSON.stringify({"event":"test", "channel":"test"})); 
      }; 
      ws.onmessage = function(msg) { 
       var price = response[7]; 
       if(hb != "hb" && typeof hb != 'undefined') { 
        price = price.toString(); 
        chrome.extension.sendMessage(price); 
       } 
      }; 
      ws.close(); 
     } 
     else if(data.checked == "bar") { 
      var pusher = new Pusher('xxxxxxxxxxxxx'); 
      var tradesChannel = pusher.subscribe('test'), 
      child = null; 
      tradesChannel.bind('test', function (data) { 
       var price = data.price; 
       if(typeof data.price != 'undefined') { 
        price = price.toString(); 
        chrome.extension.sendMessage(price); 
       } 
      }); 
      pusher.disconnect(); 
     } 
    }); 
}); 

Si Je laisse le code comme il est, je reçois WebSocket connection to 'wss://api.foo.com/ws' failed: WebSocket is closed before the connection is established. et aucune donnée n'est reçue.

Répondre

1

Votre code tel qu'il est actuellement n'a aucun sens; vous appelez immédiatement close/disconnect après avoir défini un nouveau service. De plus, vous perdez la référence à votre service push, car il est stocké dans une variable locale uniquement. Cela doit être stocké comme état quelque part - l'état global est facile, peut-être vous pouvez l'améliorer cependant.

Une solution simple ressemblerait à quelque chose comme ceci:

var ws; // We need it later, can't be a local variable 

/* ... */ 
    if(data.checked == "foo") { 
     if(ws) { ws.close(); ws = null; } 
     ws = new WebSocket('wss://api.foo.com/ws'); 
     ws.onopen = function() { 
      ws.send(JSON.stringify({"event":"test", "channel":"test"})); 
     }; 
     ws.onmessage = function(msg) { 
      var price = response[7]; 
      if(hb != "hb" && typeof hb != 'undefined') { 
       price = price.toString(); 
       chrome.extension.sendMessage(price); 
      } 
     }; 
     // Don't close the new one here 
    } 
0

Il y a un close() method dans les officiels WebSocket docs MDN:

close() Ferme la tentative de connexion WebSocket ou connexion, le cas échéant. Si la connexion est déjà FERMÉE, cette méthode ne fait rien.

void close(
    in optional unsigned short code, 
    in optional DOMString reason 
); 

Assurez-vous également que vous êtes sur le bon port. Plus de ce SO post.