1

我终于在 Shared Worker 中实现了运行 Server-Sent Event SSE。此实现允许我将服务器上运行的脚本总数限制为每个用户一个。

但是,我仍然有几个问题。

  1. SharedWorker根本不在 FireFox 中运行,但它在 Google Chrome 中运行。我正在使用 Firefox v40.0。我在控制台中没有收到任何错误。我确实在控制台中看到有关 SSL 证书的警告,但没有错误。这是来自 FireFox 控制台的警告

本网站使用 SHA-1 证书;建议您使用具有比 SHA-1 更强的哈希函数的签名算法的证书。[了解更多]

  1. 似乎ShardWorker在一段时间的空闲时间后停止工作。这不是 PHP 脚本问题,因为脚本在没有共享工作者的情况下工作文件。我在使用 Chrome v44.0 时遇到了这个问题。为了让 shardworker 重新开始,我必须重新加载页面。

我能做些什么来找出可能导致 ShardWorker 停止的原因?为什么不在SharedWorderFireFox 中运行?

这是我的实现

这是代码帽子调用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);
    }
}
4

1 回答 1

0

这是不可能的 。EventSourcewindow对象的属性。window不可用于Worker。查看工人可用的功能

工人无权访问:

  • DOM(它不是线程安全的)
  • 窗口对象
  • 文档对象
  • 父对象
于 2015-09-01T00:17:43.183 回答