JavaScript. Подробное руководство, 6-е издание, стр. 382

Как и любой прикладной интерфейс поддержки многопоточных приложений, спецификация «Web Workers» определяет две различные части. Первая - объект

<b>Worker</b>
, который представляет фоновый поток выполнения в программе, создавшей его. Вторая - объект
<b>WorkerGlobalScope</b>
, глобальный объект нового фонового потока выполнения, который представляет фоновый поток выполнения внутри него самого. Оба объекта описываются в следующих подразделах. За ними следует раздел с примерами.

22.4.1. Объект Worker

Чтобы создать новый фоновый поток, достаточно просто вызвать конструктор

<b>Worker(),</b>
передав ему URL-адрес, определяющий программный код на языке JavaScript, который должен выполняться в фоновом потоке:

<b>var loader = new Worker(&quot;utils/loader.js&quot;);</b>

Если указать относительный URL-адрес, он будет интерпретироваться относительно URL-адреса документа, содержащего сценарий, который вызвал конструктор

<b>Worker()</b>
. Если указать абсолютный URL-адрес, он должен иметь то же происхождение (протокол, имя хоста и порт), что и вмещающий документ.

После создания объекта

<b>Worker</b>
ему можно отправлять данные с помощью его метода
<b>postMessage().</b>
Значение, переданное методу
<b>postMessage(),</b>
будет скопировано (смотрите врезку «Структурированные копии» выше), и полученная копия будет передана фоновому потоку вместе с событием «message»:

<b>loader.postMessage(&quot;file.txt&quot;);</b>

Обратите внимание, что, в отличие от метода

<b>postMessage()</b>
объекта
<b>Window</b>
, метод
<b>postMessage()</b>
объекта
<b>Worker</b>
не имеет аргумента, в котором передавалась бы строка, описывающая происхождение (раздел 22.3). Кроме того, метод
<b>postMessage()</b>
объекта
<b>Worker</b>
корректно копирует сообщение во всех текущих броузерах, в отличие от
<b>Window</b>
.
<b>postMessage(),</b>
который в некоторых основных броузерах способен принимать только строковые сообщения.

Принимать сообщения от фонового потока можно с помощью обработчика события «message» объекта

<b>Worker</b>
:

<b>worker.onmessage = function(e) {</b>

<b>  var message = e.data;                  // Извлечь сообщение</b>

<b>  console.log(&quot;Содержимое: &quot; + message); // Выполнить некоторые действия</b>

<b>}</b>

Если фоновый поток возбудит исключение и не обработает его, это исключение продолжит распространение в виде события, которое также можно перехватить:

<b>worker.onerror = function(e) {</b>

<b>  // Вывести текст ошибки, включая имя файла фонового потока и номер строки</b>

<b>  console.log(&quot;Ошибка в ” + е.filename + + e.lineno + &quot;: &quot; + е.message);</b>

<b>}</b>

Подобно всем объектам, в которых могут возбуждаться события, объект

<b>Worker</b>
определяет стандартные методы
<b>addEventListener()</b>
и
<b>removeEventListener(),</b>
которые можно использовать вместо свойств
<b>onmessage</b> 
и
<b>onerror</b>
, если необходимо установить несколько обработчиков событий.

Объект

<b>Worker</b>
имеет еще один метод,
<b>terminate(),</b>
который останавливает выполнение фонового потока.

22.4.2. Область видимости фонового потока

При создании нового фонового потока с помощью конструктора

<b>Worker()</b>
вы задаете URL-адрес файла с программным кодом на языке JavaScript. Этот программный код выполняется в новой, нетронутой среде выполнения JavaScript, полностью изолированной от сценария, запустившего фоновый поток. Глобальным объектом этой изолированной среды выполнения является объект
<b>WorkerGlobalScope</b>
. Объект
<b>WorkerGlobalScope</b>
- это чуть больше, чем просто глобальный объект JavaScript, но меньше, чем полноценный клиентский объект
<b>Window</b>
.

Объект

<b>WorkerGlobalScope</b>
имеет метод
<b>postMessage()</b>
и свойство обработчика события
<b>onmessage</b>
, подобные своим аналогам в объекте
<b>Worker</b>
, но действующие в обратном направлении. Вызов метода
<b>postMessage()</b>
внутри фонового потока сгенерирует событие «message» за его пределами, а сообщения, отправляемые извне, будут превращаться в события и передаваться обработчику
<b>onmessage</b>
. Обратите внимание: благодаря тому, что объект
<b>WorkerGlobalScope</b>
является глобальным объектом для фонового потока, метод
<b>postMessage()</b>
и свойство
<b>onmessage</b>
воспринимаются программным кодом, выполняющимся в фоновом потоке, как глобальная функция и глобальная переменная.

Функция

<b>close()</b>
позволяет фоновому потоку завершить свою работу, и по своему действию она напоминает метод
<b>terminate()</b>
объекта
<b>Worker</b>
. Отметьте, однако, что в объекте
<b>Worker</b>
нет метода, который позволил бы определить, прекратил ли работу фоновый поток, как и нет свойства обработчика события
<b>onclose</b>
. Если попытаться с помощью метода
<b>postMessage()</b>
передать сообщение фоновому потоку, который прекратил работу, это сообщение будет просто проигнорировано без возбуждения исключения. В общем случае, если фоновый поток может завершить работу самостоятельно вызовом метода close(), неплохо было бы предусмотреть отправку сообщения, извещающего о прекращении работы.