Con Web Workers puede ejecutar JavaScript en un subproceso en segundo plano, donde el subproceso puede realizar tareas sin interferir con la interfaz de usuario.
reglas de uso
worker
es usarWorker()
el objeto de instancia construido para ejecutar un script de JavaScript con nombre en un subproceso de fondo.worker
Se puede crear un objeto de instancia enviando información al código JavaScript que lo creó.worker
Se ejecuta en otro contexto global, no en unwindow
objeto.worker
Los nodos DOM no se pueden manipular directamente, ni sewindow
pueden usar los métodos y propiedades predeterminados de los objetos.worker
postMessage()
Entre el hilo principal y el hilo principal, los datos respectivos se envían a través del método, y elonmessage
controlador de eventos se usa para responder a los datos, y los datos están en las propiedades delmessage
evento .data
worker
Los datos pasados hacia y desde el subproceso principal se copian adicionalmente .- El hilo principal puede
terminate()
terminar la instancia inmediatamente usando métodos en el objeto de la instanciaworker
. worker
Internamente, un hilo puede usar paraclose()
cerrarse.worker
Una de las ventajas es la capacidad de realizar operaciones que requieren un uso intensivo del procesador sin bloquear el subproceso de la interfaz de usuario.
Ejemplos de aplicación
Como se muestra en el siguiente código, la verificación de compatibilidad se realiza primero en el subproceso principal, creando un worker.js
archivo ejecutado por Worker
. Enviando myWorker.postMessage()
un mensaje. El mensaje devuelto por la myWorker.onmessage
respuesta .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);
};
}
复制代码
En Worker
, onmessage
respondiendo al mensaje enviado por el hilo principal, después de algún procesamiento, postMessage
devolviendo el mensaje al hilo principal.
// worker.js
onmessage = e => {
console.log('收到主线程的信息...');
const { a, b } = e.data;
const sum = a + b;
postMessage(sum);
};
复制代码
A partir de aquí podemos ver que en el hilo principal, onmessage
y postMessage()
debe colgar en el worker
objeto. E worker
internamente, no tiene que hacerlo, porque worker
tiene su propio alcance.
如下代码所示,在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);
};
};
复制代码
参考: