H5 Web Worker(Dedicate worker)

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');
}
  1. worker线程的创建的是异步的

代码执行到”var worker = new Worker(task.js’)“时,在内核中构造WebCore::JSWorker对象(JSBbindings层)以及对应的WebCore::Worker对象(WebCore模块),根据初始化的url地址”task.js”发起异步加载的流程;主线程代码不会阻塞在这里等待worker线程去加载、执行指定的脚本文件,而是会立即向下继续执行后面代码。

  1. postMessage消息交互由内核调度

main.js中,在创建woker线程后,立即调用了postMessage方法传递了数据,在worker线程还没创建完成时,main.js中发出的消息,会先存储在一个临时消息队列中,当异步创建worker线程完成,临时消息队列中的消息数据复制到woker对应的WorkerRunLoop的消息队列中,worker线程开始处理消息。在经过一轮消息来回后,继续通信时, 这个时候因为worker线程已经创建,所以消息会直接添加到WorkerRunLoop的消息队列中;

5.API进阶
在worker线程中,可以获得下列对象

  1. navigator对象
  2. location对象,只读
  3. XMLHttpRequest对象
  4. setTimeout/setInterval方法
  5. Application Cache
  6. 通过importScripts()方法加载其他脚本
  7. 创建新的Web Worker
    worker线程不能获得下列对象
  8. DOM对象
  9. window对象
  10. document对象
  11. parent对象

你可能感兴趣的:(H5 Web Worker(Dedicate worker))