说说web workers的用法

133 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8月更文挑战」的第8天,点击查看活动详情

什么是Web Workers

web worker是运行在后台的JavaScript,不会影响页面的性能。当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。

Web Workers的使用
1-创建Worker实例

const worker = new Worker('https://xxx.xxx.js');

参数是一个url,规定必须与主线程的脚本文件同源,并且所加载的脚本必须是网络资源文件。

2-线程之间通过postMessage/onMessage通信 (相互之间的通信可以传递对象或者数组)

//主线程与 Worker 线程通信
worker.postMessage({ 
    xxxx
});
//主线程监听接收 Worker 线程返回的信息
worker.onmessage = function (event) { 
    console.log(event); 
}
// 主线程关闭 Worker 线程
worker.terminate();
// 监听错误信息
worker.onerror = (err) => { 

};

3-self 代表worker进程自身

//监听
self.onmessage =(event) => { 
console.log(event.data); 
};

// 发送
self.postMessage({ 
  
});

// 关闭
self.close()

4-worker线程加载脚本 使用importScripts()来引入脚本,能够动态导入js脚本文件,脚本的下载顺序不固定,但执行时会按照调用顺序进行。

importScripts('http1.js','http2.js');

Worker线程限制
无法使用window对象,document对象, DOM对象,parent对象。

可以使用navigator对象,只读location,XMLHttpRequest对象,setTimeout/setInterval,Application Cache应用缓存。

使用Web Workers的优化
主线程与 worker 线程之间的通信是拷贝关系,所以数据量很大时,会造成性能问题。Web Worker允许主线程把二进制数据直接转移给子线程,而且转移后原先的进程就无法再使用这些二进制数据了。提升了性能,也避免出现多个线程同时处理数据的问题。