轻松使用WebWorker,解放耗时较大的算法代码

Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法。线程可以执行任务而不干扰用户界面。

基础知识

MDN-web-worker

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:

  1. 简化了对Worker类的调用;

  2. 无需进一步修改worker.js内部方法;

  3. 可以执行在任意脚本文件中的方法,无需copy到worker.js文件中;

WebWorker类

WebWorker.js

math.js: 耗时大,且会阻塞线程影响浏览器渲染的方法

worker.js: 一个专用worker仅仅能被生成它的脚本所使用。

main.js: 引入到页面,初始化WebWorker

通过main.js的调用方法,可以使任意文件的方法被调用。

使用注意:

  1. workerUrl: 使用绝对地址或者相对WebWorker.js的地址(Worker是在WebWorker中初始化的);

  2. scripts: 被引入的script文件必须是传统JS库;

“依赖传统JS库”意为着被依赖的JS文件,很有可能不是 CMD,AMD,UMD或ES 6模块文件。相反,所谓的传统JS库文件通常是被包装成为一个IIFE表达式(即,一个立即执行的大闭包),并且输出一个全局变量作为暴露API集的顶层命名空间。

测试示例

最后更新于

这有帮助吗?