worker 在浏览器中的作用
December 10, 2019
worker
javascript 是单线程的,意味着任务只能分时排队进行,在进程UI计算的时候,js线程只能等待,不能做其它的事情,web worker的出现是为了支持web多线程运行,在做高负担计算的同时,也不会影响到主线程UI交互的流畅性。
worker线程可以理解为是主线程的打工小弟,主线程可以把任务派发给worker,worker通过计算之后,把计算的结果回传给主线程。
相比主线程,worker线程有以下限制
- 同源限制,worker 脚本地址需要和主线程脚本同域
- DOM 限制,worker 获取不了除了navigator和location之外的dom对象
- 通信限制,worker 线程和主线程不能直接通信,需要通过消息传递完成
使用
主线程和worker线程通过message进行消息传递
主线程监听message事件,并向worker传递消息,注意消息可以是string,blob等各种内容
const worker = new Worker('./worker.js');
worker.addEventListener('message', e => {
console.log('get message from worker: ', e.data);
});
worker.postMessage('hello world')
同理,worker 线程监听message事件来获取消息,postMessage发送消息
self.addEventListener('message', e => {
console.log('[worker] get message', e);
self.postMessage('postMessage to main');
});