API WebWorkers
API WebWorkers
Un worker es un objeto del tipo “Worker”, el cual ejecuta un archivo JavaScript, el cual se
ejecuta en un contexto global diferente al actual del navegador. Este contexto está
representado por los objetos: DedicatedWorkerGlobalScope, para los worker dedicados y
SharedWorkerGlobalScope, para los worker compartidos.
El hilo worker puede realizar tares sin interferir en con la interfaz del usuario. Además de
realizar operaciones de entrada y salida usando el objeto XMLHttpRequest.
Propiedades
Worker.onerror
Controlador de eventos que se llama cuando ocurre el evento error.
Sintaxis:
miWorker.onerror = function(evento) { ... };
Ejemplo:
var miWorker = new Worker('worker.js');
miWorker.onerror = function(evento) {
console.error(“Ha ocurrido un error con el worker!”);
}
Worker.onmessage
Controlador de eventos que se llama cuando se produce el mensaje. Estos eventos son del
tipo “MessageEvent” y se llaman cuando el padre del “Worker” recibe el mensaje.
Sintaxis:
miWorker. onmessage = function(evento) { ... };
1
Ejemplo
En el hilo principal
onmessage = function(evento) {
let raiz = Math.sqrt(evento.data);
postMessage("Raiz de " +evento.data + " = " + raiz);
};
Worker.onmessageerror
Controlador de eventos que se llama cuando se activa evento tipo “messageerror”, ósea
cuando se recibe un mensaje que no se puede deserializar.
Sintaxis:
miWorker.onmessageerror = function(evento) { ... };
Ejemplo:
var miWorker = new Worker('worker.js');
miWorker. onmessageerror = function(evento) {
console.log (“Ha ocurrido un error con el worker!”);
}
2
Métodos
Worker.terminate()
Termina inmediatamente el “worker”
Sintaxis:
miWorker.terminate();
Ejemplo:
var miWorker = new Worker('worker.js');
miWorker.terminate();
Worker. postMessage()
Se envía el mensaje al ámbito interno del “worker”.
Sintaxis:
worker.postMessage(mensaje, [transferencia]);
mensaje:
Objeto para entregar al worker. Puede ser cualquier valor u objeto JavaScript. Si se
omite se genera un error. Si no se desea enviar datos, se puede enviar “null” o “undefined”
transferencia:
Opcional, una matriz de objetos para transferir propiedades. Los objetos trasferibles
son instancias de clases como ArrayBuffer, MessagePort o ImageBitmap.
Ejemplo:
En el hilo principal
onmessage = function(evento) {
let raiz = Math.sqrt(evento.data);
3
postMessage("Raiz de " +evento.data + " = " + raiz);
};
Ejercicios
Ejercicio 1
En la carpeta de trabajo “javascript”, creamos una carpeta con el nombre “clase-10 api-
worker” y dentro un archivo llamado “prueba-worker.js”, otro “test.js” y uno llamado
“index.html”. En el archivo “index.html” copie el siguiente código:
Paso a paso
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Web Worker</title>
</head>
<body>
<script src="test.js"></script>
<h1>Hola mundo</h1>
</body>
</html>
Note, que primero se está llamando el archivo “test.js”, lo que significa que primero se va a
ejecutar todas sentencias JavaScript dentro de “test.js” y cuando termine sigue la ejecución del
código HTML (“<h1>Hola mundo<h1>”). Guarde el archivo “index.html”.
4
Guarde el archivo “index.html”. En el editor de código abra el archivo “test.js” y copie el
siguiente código:
Paso a paso
for (let i=0; i<10000000; i++){
console.log(i);
}
Figura 1
Nota: para hacer el ejercicio utilizando “worker”, la página se tiene que correr desde un
servidor web. En el apéndice E, se explica cómo instalar un servidor web local.
5
Ejercicio 2
Utilizando un “worker”.
Paso a paso
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Web Worker</title>
</head>
<body>
<script src="prueba-worker.js"></script>
<h1>Hola mundo<h1>
</body>
</html>
6
Guarde el archivo “index.html”. En el editor de código abra el archivo “prueba-
worker.js” y copie el siguiente código:
Paso a paso
Figura 2
7
Ejercicio 3
En este ejercicio vamos a crear una aplicación para mostrar en pantalla todos los números
primos que existen, desde 0 hasta el total determinado por el usuario. La pantalla principal va a
tener una caja de entrada de información donde se va a digital el total de números a buscar y
un botón para iniciar la búsqueda. Para resolver el ejercicio vamos a utilizar “worker”.
Paso a paso
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Web Worker</title>
</head>
<body>
</body>
</html>
8
Guarde el archivo “index.html”. En el editor de código abra el archivo “prueba-
worker.js”, comente el código anterior y copie el siguiente:
Paso a paso
var numeroPrimo= document.getElementById("numero_primo");
var resultadoPrimo= document.getElementById("resultado_primo");
var btnPrimo= document.getElementById("btn_primo");
var miWorker;
function buscarPrimo(){
resultadoPrimo.innerText="";
if(miWorker !== undefined)
miWorker.terminate();
miWorker.onerror = function(event) {
console.error(“Ha ocurrido un error con el worker!”);
}
9
En el archivo “prueba-worker.js”, se crea una función con el nombre “buscarPrimo()”,
la cual se va a llamar cuando se presione el botón buscar de la página. Dentro de la función, lo
primero que se hace es verificar si existe el objeto “Worker”, en caso de existir se termina con
el método “terminate()”.
Seguidamente se crea un objeto “Worker”, que se le pasa como parámetro la URL del
archivo “primo.js”.
miWorker.postMessage(numeroPrimo.value);
miWorker.onmessage = function(evento){
resultadoPrimo.innerText +=evento.data + ' | ';
}
10
miWorker.onerror = function(event) {
console.error(“Ha ocurrido un error con el worker!”);
}
Paso a paso
onmessage = function(evento){
Number.prototype.isPrime = function() {
11
onmessage = function(evento){
….
postMessage(i);
}
Guarde el archivo, abra la página en el navegador, digite el número que dese y presione en
el botón buscar. En la pantalla se van listando los números que son primos como se muestra
en la figura 3. Para probar lo eficiente que es el trabajo con “worker”, digite un número bien
grande, 10 millones y presiones el botón buscar, cuando inicien a listarse los valores en el
navegador, digite 100 y presionen buscar, verán la búsqueda anterior de detiene y se realiza la
nueva búsqueda. Eso sería imposible si no se utiliza “worker”, la primera búsqueda de 10
millones tendría bloqueado el navegador.
Figura 3
12
Ejercicio de repaso
Basándose en el ejercicio 3, amplíe la funcionalidad de la aplicación, para además de mostrar
los números primos, también mostrar todos los números con raíz cuadrada exacta que existan
desde el 0 hasta el total determinado por el usuario.
13