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

Наибольший интерес представляет глобальная функция

<b>importScripts(),</b>
определяемая объектом
<b>WorkerGlobalScope</b>
: фоновые потоки выполнения могут использовать ее для загрузки любых необходимых им библиотек. Например:

<b>// Перед началом работы загрузить необходимые классы и утилиты </b>

<b>importScripts(&quot;collections/Set.js&quot;, &quot;collections/Map.js&quot;, &quot;utils/base64.js&quot;);</b>

Функция

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

Функция

<b>importScripts()</b>
выполняется синхронно: она не вернет управление, пока не будут загружены и выполнены все сценарии. Сценарии, указанные в вызове функции
<b>importScripts(),</b>
можно использовать сразу, как только она вернет управление: нет никакой необходимости определять функцию обратного вызова или обработчик события. После того как вы свыклись с асинхронной природой клиентского JavaScript, такой возврат к простой, синхронной модели может показаться странным. Но в этом и заключается достоинство потоков выполнения: в фоновом потоке можно использовать блокирующие функции, не блокируя цикл событий в основном потоке выполнения и не блокируя вычисления, выполняемые параллельно в других фоновых потоках.

Поскольку для фоновых потоков выполнения

<b>WorkerGlobalScope</b>
является глобальным объектом, он обладает всеми свойствами базового глобального объекта JavaScript, такими как объект
<b>JSON</b>
, функция
<b>isNaN()</b>
и конструктор
<b>Date()</b>
. (Полный список можно найти в справочной статье
<b>Global</b>
, в третьей части книги.) Однако, кроме того, объект
<b>WorkerGlobalScope</b>
имеет следующие свойства клиентского объекта
<b>Window</b>
:

<b>self</b>
- ссылка на сам глобальный объект. Отметьте, однако, что в объекте
<b>WorkerGlobalScope</b>
отсутствует синонимичное свойство window, имеющееся в объекте
<b>Window</b>
.

Модель выполнения фонового потока

Фоновые потоки выполняют свой программный код (и все импортированные сценарии) синхронно, от начала до конца, и затем переходят в асинхронную фазу выполнения, когда они откликаются на события и таймеры. Если фоновый поток регистрирует обработчик события onmessage, он никогда не завершит работу, пока есть вероятность поступления событий «message». Но если фоновый поток не принимает сообщения, он будет работать, пока не будут выполнены все задания (такие как загрузка или таймеры) и не будут вызваны все функции, связанные с этими заданиями. После вызова всех зарегистрированных функций обратного вызова в фоновом потоке нет никакой возможности начать выполнять новые задания, поэтому он может смело завершить свою работу. Представьте себе фоновый поток без обработчика событий onmessage, который загружает файл с помощью объекта XMLHttpRequest. Если обработчик onload запустит загрузку другого файла или зарегистрирует обработчик таймера вызовом функции setTimeout(), поток выполнения получит новое задание и продолжит работу. Иначе он завершится.

************************************************

• Методы работы с таймерами

<b>setTimeout(), clearTimeout(), setInterval()</b>
и
<b>clearInterval().</b>

• Свойство

<b>location</b>
, содержащее URL-адрес, переданный конструктору
<b>Worker</b>
( Это свойство ссылается на объект
<b>Location</b>
, как и аналогичное ему свойство location объекта
<b>Window</b>
. Объект Location имеет свойства
<b>href, protocol, host, hostname, port, pathname, search</b>
и
<b>hash</b>
. В фоновом потоке эти свойства доступны только для чтения.

• Свойство

<b>navigator</b>
, ссылающееся на объект, обладающий теми же свойствами, что и объект
<b>Navigator</b>
окна. Объект
<b>navigator</b>
фонового потока имеет свойства
<b>appName, appVersion, platform, userAgent</b>
и
<b>onLine</b>
.

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

<b>addEventListener()</b>
и
<b>removeEventListener().</b>

• Свойство

<b>onerror</b>
, которому можно присвоить функцию обработки ошибок, подобное свойству
<b>Window.onerror</b>
, которое описывается в разделе 14.6. Обработчик ошибок, если его зарегистрировать, будет получать три аргумента с сообщением об ошибке, URL-адресом и номером строки. Он может вернуть false, чтобы показать, что ошибка обработана и не должна распространяться дальше в виде события «error» в объекте
<b>Worker</b>
. (Однако на момент написания этих строк обработка ошибок в разных броузерах была реализована несовместимым способом.)

Дополнительные особенности объекта Worker

Фоновые потоки выполнения, описываемые в этом разделе, являются выделенными фоновыми потоками: они связаны (или выделены из) с общим родительским потоком выполнения. Спецификация «Web Workers» определяет еще один тип фоновых потоков выполнения, разделяемые потоки выполнения. На момент написания этих строк броузеры еще не поддерживали разделяемые потоки выполнения. Однако их назначение состоит в том, чтобы играть роль именованного ресурса, который может предоставлять вычислительные услуги любым другим потокам выполнения. На практике взаимодействие с разделяемым потоком выполнения напоминает взаимодействие с сервером посредством сетевых сокетов.