Trabalhar de forma assíncrona e paralela nos demanda cada dia mais na construção de aplicativos web com maior facilidade e performance. A especificação de Web Workers (link em inglês) define uma API para geração de scripts de segundo plano no seu aplicativo da web.
O Web Workers permite executar tarefas como disparar scripts de longa duração para executar tarefas muito dispendiosas, mas sem bloquear a interface de usuário ou outros scripts para manipular interações com o usuário. Seria basicamente trabalhar com multi threads dentro do javascript.
Então o que é um Web Worker?
Normalmente, ao executar scripts em uma página HTML, a página não responde até que o script seja concluído. Um Web work é um JavaScript que é executado em segundo plano, independentemente de outros scripts, sem afetar o desempenho da página. Você pode continuar fazendo o que quiser: clicando, selecionando coisas, etc., enquanto o trabalhador da Web é executado em segundo plano.
Verifique o suporte do Web Worker
Antes de criar um web worker, verifique se o navegador do usuário o suporta:
if (typeof(Worker) !== "undefined") {
// Temos suporte à webworker!
// Faça o que precisar.....
} else {
// Não temos suporte :(
} Crie um arquivo do Web Worker
Agora, vamos criar o nosso web worker em um JavaScript externo. Aqui, criamos um script que faz uma simples contagem crescente. O script é armazenado no arquivo “demo_workers.js”, mas você pode colocar o nome que desejar:
var i = 0;
function timedCount() {
i = i + 1;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();A parte importante do código acima é o método postMessage() – que é usado para publicar uma mensagem de volta para a página HTML.
Nota: Normalmente, os web workers não são utilizados para scripts tão simples, mas para tarefas mais intensivas em CPU.
Crie um Objeto Web Worker
Agora que temos o arquivo do worker, precisamos chamá-lo de uma página HTML. As seguintes linhas verificam se o trabalhador já existe, se não – cria um novo objeto de trabalhador web e executa o código em “demo_workers.js”, também adicionamos um evento de listener “onmessage” ao worker:
if (typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event){
document.getElementById("result").innerHTML = event.data;
};
Código de Exemplo completo
Já vimos o código do worker no arquivo .js. Abaixo está o código da página HTML que chama o worker e executa a função contadora na página:
<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
var w;
function startWorker() {
//criar o web worker
if(typeof(Worker) !== "undefined") {
if(typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
} else {
document.getElementById("result").innerHTML = "Você não possui suporte ao Web Worker.";
}
}
function stopWorker() {
//finalizando e resetando o web worker
w.terminate();
w = undefined;
}
</script>
</body>
</html>
Limitações
Como citado no trecho acima, temos algumas limitações evidentes. O Web Worker não pode, por exemplo, acessar o DOM da sua página, ou fazer qualquer alteração no HTML Document.
Vantagens
A principal vantagem é que o Web Worker é assíncrono e não bloqueante. Ou seja, podemos processar algo que normalmente levaria muito tempo e que impediria a interação do usuário em nossa página por um tempo, sem que o usuário fique limitado de forma alguma.
Espero que tenham gostado e aprendido um pouco mais sobre como trabalhar de forma multi thread com javascript! 😉
Grande abraço!


