为什么我的ShardWorker不是在Firefox中运行而是在Google Chrome中运行

时间:2015-08-31 21:22:21

标签: javascript jquery web-worker shared-worker

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

但是,我仍有几个问题。

  1. SharedWorker在FireFox中根本不运行,但它在谷歌浏览器中运行。我使用的是firefox v40.0。我在控制台中没有出现任何错误。我确实在控制台中看到有关SSL证书的警告,但没有错误。以下是来自FireFox控制台的警告
  2.   

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

    1. 似乎ShardWorker在闲置一段时间后停止工作。这不是PHP脚本问题,因为脚本在没有共享工作程序的情况下工作。我在使用Chrome v44.0时遇到了这个问题。为了让shardworker重新开始,我必须重新加载页面。
    2. 我该怎么做才能找出导致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);
          }
      }
      

1 个答案:

答案 0 :(得分:0)

这是不可能的。 EventSourcewindow对象的属性。 window无法使用Worker。见Features Available to Workers

  

工人无权访问:

     
      
  • DOM(它不是线程安全的)
  •   
  • 窗口对象
  •   
  • 文档对象
  •   
  • 父对象
  •