Перейти к основному содержимому

HTML API для Web Workers

Web worker — это внешний файл JavaScript, который выполняется в фоновом режиме, не влияя на производительность страницы.


Что такое Web Worker?

Когда скрипт выполняется на HTML-странице, страница становится неотзывчивой, пока скрипт не завершится. Web worker — это внешний файл JavaScript, который выполняется в фоновом режиме независимо от других скриптов, не влияя на страницу, поэтому вы можете продолжать кликать и выбирать, пока он работает. Web workers полезны для «тяжёлого» кода, который иначе создавал бы длительные задачи и блокировал страницу.


Поддержка браузерами

API Web Workers поддерживается всеми современными браузерами (начиная с Chrome 4, Edge 10, Firefox 3.5, Safari 4 и Opera 11.5).


Пример API Web Workers

Простой web worker может считать числа в фоновом режиме, пока страница остаётся отзывчивой.

Примечание: Web workers обычно не используются для таких простых скриптов, а для более требовательных к процессору задач.


Проверка поддержки API Web Worker

Перед использованием web worker можно быстро проверить поддержку, протестировав typeof(Worker).

Пример

Проверка поддержки Web Worker.

Prompt
Страница со скриптом, который проверяет, поддерживает ли браузер Web Workers (typeof Worker), и записывает сообщение о поддержке или её отсутствии в абзац с id result.
Результат: полная HTML-страница

Создание файла Web Worker .js

Web worker находится во внешнем файле JavaScript. Вот скрипт, который считает, сохранённый в demo_workers.js.

Примечание: Важная часть — метод postMessage(), который отправляет сообщения обратно на HTML-страницу.

demo_workers.js

Внешний файл worker'а, который считает и отправляет каждое число обратно.

script.js
var i = 0;

function timedCount() {
  i = i + 1;
  postMessage(i);
  setTimeout("timedCount()", 500);
}

timedCount();

Создание объекта Web Worker

После создания файла .js вы вызываете его со страницы HTML. Код проверяет, существует ли уже worker, и если нет — создаёт его с помощью new Worker("demo_workers.js"). Данные передаются между worker'ом и основным потоком через сообщения: обе стороны отправляют их с помощью postMessage() и отвечают через обработчик события onmessage. Вы добавляете слушатель onmessage к объекту worker, и когда worker отправляет сообщение, слушатель запускается, а данные доступны в event.data.


Остановка Web Worker

После создания web worker продолжает слушать сообщения, пока не будет остановлен. Чтобы остановить его и освободить ресурсы, вызовите метод terminate().


Повторное использование Web Worker

Если после остановки задать переменной worker значение undefined, можно повторно использовать код worker'а.


Полный пример Web Worker

Ниже приведена полная HTML-страница, работающая с файлом worker'а, показанным ранее.

Пример

Полная страница, которая запускает и останавливает считающий web worker.

Prompt
Полная страница, использующая веб-воркер: элемент output (id result) и кнопки «Запустить Worker» и «Остановить Worker». Запуск создаёт Worker из demo_workers.js (если он ещё не создан) и показывает сообщения через onmessage; Остановка завершает воркер и устанавливает его в undefined. Возвращается к запасному сообщению, если Web Workers не поддерживаются.
Результат: полная HTML-страница

Web Workers и DOM

Поскольку web workers находятся во внешних файлах .js, они не могут получить доступ к объекту window, объекту document или объекту parent.