С помощью Web Workers вы можете запускать JavaScript в фоновом потоке, где поток может выполнять задачи, не мешая пользовательскому интерфейсу.
правила использования
worker
заключается в использованииWorker()
сконструированного экземпляра объекта для запуска именованного сценария JavaScript в фоновом потоке.worker
Объект экземпляра можно создать, отправив информацию коду JavaScript, который его создал.worker
Выполняется в другом глобальном контексте, а не вwindow
объекте.worker
Узлы DOM не могут управляться напрямую, а также нельзяwindow
использовать методы и свойства объектов по умолчанию.worker
Между основным потоком и основным потоком через методpostMessage()
передаются соответствующие данные , иonmessage
обработчик событий используется для ответа на данные, а данные находятся в свойствахmessage
события .data
worker
Данные, передаваемые в основной поток и из него, дополнительно копируются .- Основной поток может
terminate()
немедленно завершить работу экземпляра, используя методы объекта экземпляраworker
. worker
Внутри поток может использовать, чтобыclose()
закрыть себя.worker
Одним из преимуществ является возможность выполнять ресурсоемкие операции без блокировки потока пользовательского интерфейса.
Примеры применения
Как показано в следующем коде, проверка совместимости сначала выполняется в основном потоке, создавая worker.js
исполняемый файл Worker
. Отправив myWorker.postMessage()
сообщение. Сообщение , возвращенное myWorker.onmessage
ответом .Worker
const a = 1;
const b = 2;
if (window.Worker) {
const myWorker = new Worker('./worker.js');
myWorker.postMessage({ a, b });
myWorker.onmessage = e => {
console.log('收到worker的信息...');
console.log(e.data);
};
}
复制代码
В Worker
, onmessage
отвечая на сообщение, отправленное основным потоком, после некоторой обработки, postMessage
возвращая сообщение в основной поток.
// worker.js
onmessage = e => {
console.log('收到主线程的信息...');
const { a, b } = e.data;
const sum = a + b;
postMessage(sum);
};
复制代码
Отсюда видно, что в основном потоке onmessage
и postMessage()
должен висеть worker
объект. И worker
внутренне это не обязательно, потому что у него worker
есть своя область применения.
如下代码所示,在worker
的onmessage
中打印this
:
onmessage = e => {
console.log(this);
};
复制代码
终止 worker
在上述代码中,若在主线程中调用myWorker.terminate()
,则不会收到任何消息,因为worker
线程刚创建完毕就被终止。
const a = 1;
const b = 2;
if (window.Worker) {
const myWorker = new Worker('./worker.js');
myWorker.postMessage({ a, b });
// 终止myWorker
myWorker.terminate();
myWorker.onmessage = e => {
console.log('收到worker的信息...');
console.log(e.data);
};
}
复制代码
同样,在worker
线程中调用close()
,主线程也不会有任何响应,因为线程刚启动就被关闭。
close();
onmessage = e => {
console.log('收到主线程的信息...');
const { a, b } = e.data;
const sum = a + b;
postMessage(sum);
};
复制代码
共享 worker
主线程:
const a = 1;
const b = 2;
if (window.Worker) {
const myWorker = new SharedWorker('./worker.js');
myWorker.port.postMessage({ a, b });
myWorker.port.onmessage = e => {
console.log('收到worker的信息...');
console.log(e.data);
};
}
复制代码
worker
线程:
onconnect = e => {
const port = e.ports[0];
port.onmessage = e => {
const { a, b } = e.data;
const sum = a + b;
port.postMessage(sum);
};
};
复制代码
参考: