Чтение онлайн

на главную - закладки

Жанры

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

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

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

loader.postMessage("file.txt");

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

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

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

Worker
:

worker.onmessage = function(e) {

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

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

}

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

worker.onerror = function(e) {

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

console.log("Ошибка в ” + е.filename + + e.lineno + ": " + е.message);

}

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

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

Объект

Worker
имеет еще один метод,
terminate,
который останавливает выполнение фонового потока.

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

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

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

Объект

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

Функция

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

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

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

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

importScripts("collections/Set.js", "collections/Map.js", "utils/base64.js");

Функция

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

Функция

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

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

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

Поделиться:
Популярные книги

На границе империй. Том 10. Часть 7

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 7

Фантом памяти

Маринина Александра
2. Преступления правильной жизни
Детективы:
прочие детективы
8.43
рейтинг книги
Фантом памяти

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Товарищ "Чума" 7

lanpirot
7. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 7

Целого Мира Мало

Джиллиан Алекс
Любовные романы:
современные любовные романы
8.88
рейтинг книги
Целого Мира Мало

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Изгой Проклятого Клана. Том 3

Пламенев Владимир
3. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 3

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV