WebWorker类似于浏览器中的多线程操作。之前的JS中,无论你是使用setTimeout、setInterval 还是 使用了XMLHttpRequest,都是在一个线程里面。前两个使用消息队列,XMLHttpRequest则是浏览器会帮你进行闲时进行。归根结底,都是在一个线程里面跑。如果用户想进行一些阻塞操作,很可能会产生卡住页面的情况。
1.Web Worker是什么
Web Worker 是HTML5标准的一部分,这一规范定义了一套 API,它允许一段JavaScript程序运行在主线程之外的另外一个线程中。Web Worker 规范中定义了两类工作线程,分别是专用线程Dedicated Worker和共享线程 Shared Worker,其中,Dedicated Worker只能为一个页面所使用,而Shared Worker则可以被多个页面所共享。
main.js
var worker = new Worker('task.js');
console.log('main 1')
worker.postMessage("message from main.js");
//----接收task发出的信息
worker.addEventListener('message', function(event) {
console.log('main 4')
var data = event.data;
console.log("I got the message from taks.js " + data);
worker.terminate();
})
console.log('main 2')
worker.onerror = function(error) {
console.log(error.filename, error.lineno, error.message);
}
task.js
console.log('task 3');
onmessage = function(event) {
var data = event.data;
console.log("got message from main.js,message=" + data);
postMessage('Hi from task.js');
}
- worker线程的创建的是异步的
代码执行到”var worker = new Worker(task.js’)“时,在内核中构造WebCore::JSWorker对象(JSBbindings层)以及对应的WebCore::Worker对象(WebCore模块),根据初始化的url地址”task.js”发起异步加载的流程;主线程代码不会阻塞在这里等待worker线程去加载、执行指定的脚本文件,而是会立即向下继续执行后面代码。
- postMessage消息交互由内核调度
main.js中,在创建woker线程后,立即调用了postMessage方法传递了数据,在worker线程还没创建完成时,main.js中发出的消息,会先存储在一个临时消息队列中,当异步创建worker线程完成,临时消息队列中的消息数据复制到woker对应的WorkerRunLoop的消息队列中,worker线程开始处理消息。在经过一轮消息来回后,继续通信时, 这个时候因为worker线程已经创建,所以消息会直接添加到WorkerRunLoop的消息队列中;
5.API进阶
在worker线程中,可以获得下列对象
- navigator对象
- location对象,只读
- XMLHttpRequest对象
- setTimeout/setInterval方法
- Application Cache
- 通过importScripts()方法加载其他脚本
- 创建新的Web Worker
worker线程不能获得下列对象 - DOM对象
- window对象
- document对象
- parent对象
网友评论