【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()
- [生成一个专用worker] main.js
const myWork = new Worker('worker.js') // 需要运行的本地js文件
postMessage()
- [主线程发送消息给worker] main.js
document.querySelectAll('#button').addEventListener('click',()=>{
myWork.postMessage('message to work')
})
onmessage()
- [worker使用onmessage监听] work.js
onmessage = function(e){
e.data // 'message to work'
// 接收消息后,传递信号给主线程
postMessage('message to mainjs')
}
- [主线程监听] ,main.js
myWork.onmessage = function(e){
e.data // 'message to mainjs'
}
其他API
terminate方法、close方法
- 终止worker
// 在主线程中直接终止 main.js
myWorker.terminate()
// 也可以在worker中调用close()方法 // work.js
close()
- 处理错误
onerror 事件
myWorker.onerror = () => {
// 处理错误
}