2

SharedWorkerはメッセージ ポートを使用して とメッセージを交換しますParentWorker

親労働者

var port = new SharedWorker('/worker.js').port;
port.onmessage = function(e){
    console.log(e.data);
};
port.start();
port.postMessage("Hello Shared Worker. I'm Mr. Tab");

SharedWorker (worker.js)

onconnect = function(e){
    var port = e.ports[0];
    port.onmessage = function(e){
        console.log(e.data);
    };
    port.start();
    port.postMessage("Hello Mr. Tab. I'm Shared Worker.");
};

サービスワーカーはどうですか?SharedWorkerポートに似たものはありますか?

4

3 に答える 3

3

動作は次のとおりです。

// in the page:
navigator.serviceWorker.controller.postMessage("Hi!");

// in the ServiceWorker:
self.onmessage = function(event) {
  event.source; // instance of Client
  event.data; // "Hi!"
  // reply
  event.source.postMessage("Hey!");
};

// back in the page:
navigator.serviceWorker.onmessage = function(event) {
  event.source; // instance of ServiceWorker
  event.data; // "Hey!"
};

執筆時点では、Chrome は現在、以前の仕様に基づいて、ServiceWorker から Window へのポストメッセージを window.onmessage に送信しています。また、event.source は null です。

当面の解決策が必要な場合は、独自の MessageChannel を渡します。https://jakearchibald.github.io/isserviceworkerready/demos/postMessage/でデモを参照してください。

于 2015-03-25T15:58:26.630 に答える
0

を調べると、メソッドをServiceWorker.prototype使用できるように見えますが、ウィンドウ側からのイベントはないようです。これを文書化したhttps://slightlyoff.github.io/ServiceWorker/spec/service_worker/も参照してください。myWorker.postMessagemyWorker.onmessage

self.onmessageイベント(http://www.w3.org/TR/service-workers/#service-worker-global-scopeおよびhttps://slightlyoff.github.io/ServiceWorker/spec/service_worker/ )を使用できますが、一見使用できませんself.postMessageワーカー側からのメソッド。

したがって、現在、Service Worker にメッセージを送信できるようですが、その逆はできません。http://www.w3.org/TR/service-workers/ServiceWorkerGlobalScopeから継承されWorkerGlobalScopeていることを考えると、できるはずですが、これは私が見つけたドキュメントでは明示的に言及されていません。https://slightlyoff.github.io/ServiceWorker/spec/service_worker/のドキュメントを考慮すると、少なくとも Chrome ブラウザーでは代わりに継承されます。EventTarget

提案として、サービス ワーカーがキャッシュ ヒットとして特別な方法でサービスを提供するポーリング Web 要求を送信することにより、逆方向の通信がぎこちなく達成される可能性があります。

于 2015-03-24T10:49:37.530 に答える
0

SharedWorker@Jaffa The Cakeの答えは、 Portとまったく同じものではなく、単純なメッセージチャネルの出入りです。現時点では、 Port in に似たビルトイン インターフェイスはありません。SharedWorkerServiceWorkerメッセージ チャネル API は必須です。これがその1つです。

yourapp.js

var mc = new MessageChannel();
mc.port1.onmessage = function(e){
    console.log(e.data);
};
var sw = navigator.serviceWorker;
sw.register('/sw.js',{scope : '/'}).then(function(){
    console.log("Service Worker is successfully registered.");
}).catch(function(er){
    console.log("Registration failed.");
});
sw.ready.then(function(reg){
    reg.active.postMessage('',[mc.port2]); //initialise the messaging channel
    mc.port1.postMessage("Hello Service Worker. I'm Mr. Tab.");
});

sw.js

//equals to onconnect in Shared Worker
onmessage = function(e){
    var port = e.ports[0];
    port.onmessage = function(e){
        console.log(e.data);
    };
    port.postMessage("Hello Mr. Tab. I'm Service Worker.");
};

注: このコードは Chrome 43 ベータ版でテストされています。

于 2015-03-28T17:30:00.023 に答える