2015-06-08 2 views
1

The MDN Documentation on SharedWorkers состояния:Отправка сообщения от SharedWorker к SharedWorker

The SharedWorker interface represents a specific kind of worker that can be accessed from several browsing contexts, such as several windows, iframes or even workers.

Для меня это звучит так, как будто SharedWorkers должны иметь возможность напрямую обмениваться сообщениями. Однако, если я пытаюсь получить доступ к SharedWorker из другого SharedWorker, а именно с

var worker = new SharedWorker("path/to/file.js"); 

Я получаю

ReferenceError: SharedWorker is not defined

ли я просто неправильно понял документацию, или есть другой способ сделать это?

+0

выделенных рабочих отличаются от общих рабочих, как указано на этой же странице. То, что вы подчеркнули, относится к специализированным работникам, а не к общим работникам. Так что да, вы неправильно читаете документацию;) Я действительно не знаю другого способа сделать это, и я не вижу никакого реального случая, почему я хотел бы это сделать. (Но, я думаю, вы просто просите об этом из любопытства, которое, конечно, в порядке). –

+0

У меня есть приложение с несколькими окнами, которое должно было использовать SharedWorkers в виде архитектуры конвейера, без необходимости перенаправлять сообщения между этапами трубопровода через окно браузера. Так что, для этого есть примеры использования. – aRestless

+1

«Вид трубопровода»? Что именно ты пытаешься сделать? –

ответ

2

Хотя вы, похоже, не можете создать общего пользователя из общего рабочего, вы можете общаться между ними, создавая их в основном потоке и передавая объект MessagePort одного из них. Обратите внимание, что вы должны включить порт в аргумент списка передачи в postMessage: его нельзя скопировать.

Например, в главном потоке создания рабочих, и отправить в порт одного к другому:

var myWorker1 = new SharedWorker("worker1.js"); 
myWorker1.port.start(); 

var myWorker2 = new SharedWorker("worker2.js"); 
myWorker2.port.start(); 

myWorker2.port.postMessage({worker1Port: myWorker1.port}, [myWorker1.port]); 

В первый рабочий вы можете отправлять сообщения на порт:

self.onconnect = function(e) { 
    var port = e.ports[0]; 

    self.setInterval(function() { 
    port.postMessage('sent from worker 1'); 
    }, 1000); 
}; 

, а затем во втором работнике вы можете сохранить входящий объект порта и ответить на полученные сообщения.

self.onconnect = function(e) { 
    var port = e.ports[0]; 

    port.onmessage = function(e) { 
    var worker1Port = e.data.worker1Port; 
    worker1Port.onmessage = function(e) { 
     console.log('received in worker 2', e.data); 
    }; 
    }; 
}; 

Вы можете увидеть это работает на http://plnkr.co/edit/XTOej1b1PHfWuC9LHeZc?p=preview

+0

Это выглядит очень многообещающим. Спасибо за Ваш ответ. Я попробую, как только у меня появится такая возможность. – aRestless