【web worker】偷偷摸摸的 js ~~~

200 阅读1分钟

【web worker】偷偷摸摸的 js ~~~

偷偷摸摸?

为什么说它偷偷摸摸?因为web worker是独立于其他脚本,独自运行在后台的js,不会影响主线程代码执行,且使用postMessageApi将结果传递到主线程,来进行通信。这样在执行复杂操作的脚本时,就不会阻塞主线程的代码执行了。

web worker 详解

一个web worker是使用一个构造函数创建的一个对象运行的一个命名的JavaScript文件,这个对象我们叫做 workers,运行在另一个全局上下文中,不同于当前的window。因此在worker内通过window获取全局作用域将返回错误。

在worker线程中你可以运行任何你喜欢的代码,不过有一些例外情况。比如:在worker内,不能直接操作DOM节点,也不能使用window对象的默认方法和属性。然而你可以使用大量window对象之下的东西,包括WebSockets,IndexedDB以及FireFox OS专用的Data Store API等数据存储机制。

web worker API

new Worker()
  1. [生成一个专用worker] main.js
const myWork = new Worker('worker.js') // 需要运行的本地js文件
postMessage()
  1. [主线程发送消息给worker] main.js
document.querySelectAll('#button').addEventListener('click',()=>{
       myWork.postMessage('message to work')
})
onmessage()
  1. [worker使用onmessage监听] work.js
onmessage = function(e){
    e.data // 'message to work'
    // 接收消息后,传递信号给主线程
    postMessage('message to mainjs')
}
  1. [主线程监听] ,main.js
myWork.onmessage = function(e){
    e.data // 'message to mainjs'
}

其他API

terminate方法、close方法
  1. 终止worker
// 在主线程中直接终止 main.js
myWorker.terminate()

// 也可以在worker中调用close()方法 // work.js
close()
  1. 处理错误
onerror 事件
myWorker.onerror = () => {
    // 处理错误
}

扩展知识

共享worker

生成一个共享worker