我最终实现了在共享Worker中运行服务器发送的事件SSE。这个实现允许我将服务器上运行的脚本总数限制为每个用户一个。
然而,我仍然有几个问题。
-
SharedWorker
不能在FireFox中运行,但可以在Google Chrome中运行。我用的是火狐v40.0。我在控制台中没有得到任何错误。我确实在控制台中看到关于SSL证书的警告,但没有错误。下面是来自FireFox控制台 的警告
该站点使用SHA-1证书;建议您使用具有使用哈希函数的签名算法的证书比SHA-1更强。(了解更多)
- 看起来
ShardWorker
在空闲一段时间后停止工作。这不是PHP脚本问题,因为脚本工作文件没有共享worker。我在Chrome v44.0中遇到了这个问题。如果要让shardworker重新启动,我必须重新加载页面。
我能做些什么来找出什么可能导致ShardWorker停止?为什么SharedWorder
不在FireFox中运行?
这是我的实现
这是调用SharedWorker
$(window).load(function(){
//establish connection to the shared worker
var worker = new SharedWorker("/add-ons/icws/js/worker.js");
//listen for a message send from the worker
worker.port.addEventListener("message",
function(event) {
console.log(event.data);
processServerData(event.data);
}
, false
);
//start the connection to the shared worker
worker.port.start();
});
以下是worker.js
的代码var clients = new Array();
//runs only when a new connection starts
self.onconnect = function(event) {
var port = event.ports[0];
clients.push(port);
port.start();
//implement a channel for a communication between the connecter and the SharedWorker
port.addEventListener("message",
function(event) {
replyToClientMessage(event, port);
} , false
);
}
//reply to any message sent to the SharedWorker with the same message but add the phrase "SharedWorker Said: " to it
replyToClientMessage = function (event, port) {
port.postMessage(event.data);
}
readNewMessages();
//runs every time and post the message to all the connected client
function readNewMessages(){
var serv = new EventSource('/add-ons/icws/poll.php');
serv.addEventListener("getMessagingQueue", function(event) {
var queue = JSON.parse(event.data);
notifyAllPorts(queue);
}, false);
}
//check all open clients and post a message to each
function notifyAllPorts(msg){
var len = clients.length;
var port;
for(i = 0; i < len; i++) {
port = clients[i];
port.postMessage(msg);
}
}
这不可能。EventSource
是window
对象的属性。window
对Worker
不可用。参见worker可用的功能
worker不能访问:
- DOM(它不是线程安全的)
窗口对象- 文件对象
- 父对象