如何正确关闭websockets

时间:2017-09-20 15:50:29

标签: javascript jquery google-chrome-extension websocket pusher

我正在构建一个连接到websockets并检索数据的Chrome扩展程序。我尝试构建一种方法,用户从popup.html中选择一个选项,然后它将更改为将建立连接的websocket。这很好。

我的问题是,在选择一个选项之后,新的连接是对那个websocket进行的,但前一个连接会保留返回的数据。我想在打开新连接之前关闭之前的连接。

popup.js(在radiobutton change上存储新值)

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

update.js(收到新选择的单选按钮,我试图关闭正常的websocket)

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

如果我按原样保留代码,我收到WebSocket connection to 'wss://api.foo.com/ws' failed: WebSocket is closed before the connection is established.并且没有收到任何数据。

2 个答案:

答案 0 :(得分:1)

您目前的代码毫无意义;您在设置新服务后立即致电close / disconnect

此外,您将失去对推送服务的引用,因为它仅存储在本地变量中。这需要存储在某个地方 - 全局状态很容易,也许你可以更好地设计它。

一个简单的解决方案看起来像这样:

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
    }

答案 1 :(得分:0)

官方WebSocket MDN文档中有close() method

接近() 关闭WebSocket连接或连接尝试(如果有)。如果连接已经CLOSED,则此方法不执行任何操作。

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

另外,请确保您使用的是正确的端口。更多来自SO post