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()什么和没有)?