1

ついに、Shared Worker で実行中の Server-Sent Event SSE を実装しました。この実装により、サーバー上で実行されるスクリプトの総数をユーザーごとに 1 つに制限することができました。

ただし、まだいくつかの問題があります。

  1. SharedWorkerFireFox ではまったく動作しませんが、Google Chrome では動作します。私はFirefox v40.0を使用しています。コンソールにエラーは表示されません。コンソールに SSL 証明書に関する警告が表示されますが、エラーは表示されません。FireFoxコンソールからの警告は次のとおりです

このサイトは SHA-1 証明書を使用しています。SHA-1 よりも強力なハッシュ関数を使用する署名アルゴリズムで証明書を使用することをお勧めします。[詳細]

  1. ShardWorkerしばらくアイドルタイムを過ぎると動作しなくなるようです。スクリプトは共有ワーカーなしでファイルを動作させるため、これは PHP スクリプトの問題ではありません。Chrome v44.0 でこの問題が発生しています。シャードワーカーを再開するには、ページをリロードする必要があります。

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

これは不可能です 。objectEventSourceのプロパティです。は利用できません。ワーカーが利用できる機能を見るwindowwindowWorker

労働者は以下にアクセスできません:

  • DOM (スレッドセーフではありません)
  • ウィンドウ オブジェクト
  • ドキュメント オブジェクト
  • 親オブジェクト
于 2015-09-01T00:17:43.183 に答える