轻松使用WebWorker,解放耗时较大的算法代码
Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法。线程可以执行任务而不干扰用户界面。
基础知识
MDN 讲解的已经较详细,此处不再重复。
常规用法
main.js
var first = document.querySelector('#number1');
var second = document.querySelector('#number2');
var result = document.querySelector('.result');
if (window.Worker) { // Check if Browser supports the Worker api.
// Requires script name as input
var myWorker = new Worker("worker.js");
// onkeyup could be used instead of onchange if you wanted to update the answer every time
// an entered value is changed, and you don't want to have to unfocus the field to update its .value
first.onchange = function() {
myWorker.postMessage([first.value,second.value]); // Sending message as an array to the worker
console.log('Message posted to worker');
};
second.onchange = function() {
myWorker.postMessage([first.value,second.value]);
console.log('Message posted to worker');
};
myWorker.onmessage = function(e) {
result.textContent = e.data;
console.log('Message received from worker');
};
}worker.js
巧妙用法
通过使用封装好的WebWorker类和整理后的worker.js:
简化了对Worker类的调用;
无需进一步修改worker.js内部方法;
可以执行在任意脚本文件中的方法,无需copy到worker.js文件中;
WebWorker类
WebWorker.js
math.js: 耗时大,且会阻塞线程影响浏览器渲染的方法
worker.js: 一个专用worker仅仅能被生成它的脚本所使用。
main.js: 引入到页面,初始化WebWorker
通过main.js的调用方法,可以使任意文件的方法被调用。
使用注意:
workerUrl: 使用绝对地址或者相对WebWorker.js的地址(Worker是在WebWorker中初始化的);
scripts: 被引入的script文件必须是传统JS库;
“依赖传统JS库”意为着被依赖的JS文件,很有可能不是 CMD,AMD,UMD或ES 6模块文件。相反,所谓的传统JS库文件通常是被包装成为一个IIFE表达式(即,一个立即执行的大闭包),并且输出一个全局变量作为暴露API集的顶层命名空间。
最后更新于
这有帮助吗?