学习WebWorker

  众所周知,js是单线程语言,所有的任务只能在一个线程上完成,尽管为了避免一些耗时很大的任务阻塞执行,js分为同步异步任务,详情请见event loop。随着多核cpu的出现,单线程越来越不能发挥计算机的计算能力。WebWorker正是为js创造多线程的运行环境,一些计算密集或高延迟的任务可以放在后台运行的woker线程上,从而主线程执行流畅。

WebWorker也有使用上的限制:

  • WebWorker所依赖的脚本文件必须与主线程同源。
  • WebWorker不能操作dom对象,不能访问document,window,parent这些对象。注:可以访问location、navigator。
  • 主线程与worker线程不在同一个上下文,需要通过message进行通信。
  • WebWorker不能操作本地文件,不可以执行alert(),confirm()方法。

WebWorke使用方法:

一、主线程

注册一个worker线程:

var worker = new Worker('test.js',{name:'testWorker'});

  构造函数接受一个脚本文件,要注意的是文件来自服务器!第二个参数接受一个options对象,可以表明当前woker名。

主线程与worker线程通讯通过postMessage方法:

worker.postMessage('from main');

  方法接受的参数即为主线程期望传给worker线程的消息,可以为任何类型的值。

主线程通过监听message事件接受worker线程传递过来的消息:

worker.onmessage = function (e) {
    console.log(e.data);
}

  事件对象e中的data即为worker传递过来的信息。

主线程可以监听error事件来进行错误处理:

worker.onerror = function (e) {
    console.log(e);
}

  只要webworker工作中遇到错误,都会触发主线程的error事件。

在主线程可以通过terminate方法关闭worker线程:

worker.terminate();

二、worker线程

worker线程通过监听message事件获得主线程传递过来的信息:

self.addEventListener('message',function(e) {
    console.log(e.data);
}
//同下面两种方法
this.addEventListener('message',function(e) {
    console.log(e.data);
}
addEventListener('message',function(e) {
    console.log(e.data);
}

  也可以用onmessage监听。

worker线程也使用postMessage方法与主线程通讯。

worker线程可以通过调用onclose方法关闭线程:

self.close();

  为了节约系统资源,使用过后必须关闭webworker。

三、加载js脚本

如果worker线程内部需要加载脚本,可以通过importScripts方法导入:

self.importScripts('a.js',....);

  

 

posted @ 2018-11-29 20:44  Pomm  阅读(193)  评论(0编辑  收藏  举报