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

fis*_*000 5 javascript jquery tornado long-polling websocket

我有一个异步队列工作程序在我的服务器上作为Tornado脚本运行 - 它托管了Tornado的PeriodicTask的子类,它使用来自Redis的事件.为了监视队列,我tornado.websocket.WebSocketHandler在URL上设置了一个子类,然后将客户端WebSocket JavaScript封装在一个jQuery插件中(这里是完整的代码).

我们的想法是,您可以在服务器上拥有多个队列,因此您可以使用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);
    });
}
Run Code Online (Sandbox Code Playgroud)

javascript用于window.setInterval()定期向套接字发送消息; 服务器回复询问它的队列的状态,并且套接字的前端回调更新DOM.

但问题是:经过几分钟的这种轮询- 专门通过在包含客户端套接字代码的页面之间导航 -通过抛出一个带有消息的异常DOM_ERROR_11和套接字对象为no的消息来解决套接字失败更长的有效.

在此输入图像描述

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

...有没有比我更好的方式来设置(有window.setInterval()什么和没有)?

Gua*_*ard 1

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

您也可以使用全局存储(可能是字典),其中包含套接字映射的键,并且仅将键存储为 DOM obj 属性