javascript - 使用 jQuery.data() 存储 WebSocket 连接句柄对象时出现问题——最好的办法是什么?

标签 javascript jquery websocket tornado long-polling

我的服务器上有一个作为 Tornado 脚本运行的异步队列工作程序——它托管 Tornado 的 PeriodicTask 的一个子类,该子类使用来自 Redis 的事件。为了监控队列,我在 URL 上设置了一个 tornado.websocket.WebSocketHandler 子类,然后将客户端 WebSocket JavaScript 封装在一个 jQuery 插件 ( here is the full code ) 中。

想法是,您可以在服务器上有多个队列,因此您可以使用 jQuery 模块来设置一个专门监视该队列的小部件。目前,逻辑非常简单——小部件仅指示有多少任务在其目标队列中排队。

这是有问题的初始化代码:

    /* init: */ function (_options) {
    options = $.extend(options, _options);
    var self = this;

    self.data('recently', [0,0,0,0,0,0,0,0,0]);
    self.data('options', options);
    self.data('sock', null);

    var sock = null;
    if ('endpoint' in options && options['endpoint']) {
        sock = new WebSocket(options['endpoint']);
        sock.onopen = function () {};
        sock.onclose = function () {};
        sock.onmessage = function (e) {
            var d = $.parseJSON(e.data);
            if (options.queuename in d) {
                var qlen = d[options.queuename]
                lastvalues = self.data('recently');
                lastvalues.shift();
                lastvalues.push(qlen);
                if (lastvalues.every(function (itm) { return itm == 0; })) {
                    self.each(function () {
                        var elem = $(this);
                        elem.html("<b>Currently Idle</b>");
                    });
                } else {
                    self.each(function () {
                        var elem = $(this);
                        elem.html("<b>" + qlen + "</b> Queued Signals");
                    });
                }
                self.data('recently', lastvalues);
            }
        }
    }
    self.data('sock', sock);
    return self.each(function () {
        var elem = $(this);
        elem.data('sock', sock);
    });
}

javascript 使用window.setInterval() 定期向套接字发送消息;服务器回复请求队列的状态,套接字的前端回调更新 DOM。

但问题是:在这种轮询几分钟后 ——具体是通过在包含客户端套接字代码的页面之间导航来启动的—— 套接字会因抛出异常并显示一条消息而失败像 DOM_ERROR_11 和一条消息,表明套接字对象不再有效。

enter image description here

一旦页面进入此错误状态,我必须重新启动浏览器服务器 websocket 脚本以使一切重新启动。

...有没有比我更好的设置方法(使用 window.setInterval() 等等)?

最佳答案

嗯,将重物附加到 DOM 可能不是最好的主意

你也可以有一个全局存储(可能是一个字典),其中包含键到套接字的映射,并且只将键存储为 DOM obj 属性

关于javascript - 使用 jQuery.data() 存储 WebSocket 连接句柄对象时出现问题——最好的办法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7054536/

相关文章:

javascript - 如何在悬停时更改 highcharts 不透明度?

android - 从android高速公路websocketconnection发送httpheaders的方法

iphone - 3G 连接上的 WebSockets

Spring WebSocket : Handshake failed due to invalid Upgrade header: null

javascript - ReferenceError 因为变量没有被传递

javascript - $ ("#id").ajaxStart(...) 在 ajax 请求期间被调用两次

javascript - 选中/取消选中 parent 和 child

javascript - jQuery 裁剪一个没有裁剪插件的图像

javascript - Jquery:当图像悬停时隐藏和显示div

javascript - pageinit 上的面板高度尺寸计算