Web workers

功能

浏览器实现多线程编程;

使用

  • 使用: var worker = new Worker('worker.js'); 自动载入worker.js,如果载入失败,则自动停止,不会执行;
  • 消息传递:worker.postMessage(message); 传递参数可以是简单值,也可以传递Json格式数据(依赖于浏览器版本和类型)。

postMessage({'key1':'value1', 'key2':'value2'});

  • 消息接受:

worker.addEventListener('message', function(e){

document.getElementById('d1').innerHTML = e.data;

}, false);

参数是event类型,使用.data获取传递的值:e.data。

在任务JS文件中,同样适用self.addEventListener('message', function(e){ 接受主页面传递过来的消息。


  • 特别的,在任务JS文件中,只能使用的JS特性列表:

1、navigator对象()一个包含浏览器属性的对象[[1]]

2、location 对象,只读访问。一个包含当前URL信息的对象。[[2]]

3、XMLHttpRequest,用于在后台和服务器交换数据。[[3]]

4、setTimeout()/clearTimeout() setInterval()/clearInterval()

5、The Application Cache ,H5离线存储

6、外部的JS,使用importScripts() 引入。

7、产生其他的web workers,[[4]]

  • 不能使用的特性列表:

1、DOM对象。即不能操作页面节点,需要通过消息机制,由主页面的消息接受代码来操作。

2、window对象。

3、document对象。

4、parent对象。


  • importScripts 方法

importScripts('file1.js');

importScripts('file1.js', 'file2.js');

特别的,importScripts在inline 代码中,传入的必须是绝对地址,传入相对地址将报安全错误。所以如果要在worker.js文件中使用importScripts方法,一个比较好的做法是在主页面中将当前URL传递给worker,然后在worker中拼装JS文件的绝对路径。

// 主页面中

worker.postMessage({url: document.location});

// 引入代码

importScripts(url + 'engine.js');


  • BlobBuilder 在主页面内创建worker代码,不需要单独js文件。

// Prefixed in Webkit, Chrome 12, and FF6: window.WebKitBlobBuilder, window.MozBlobBuilder

var bb = new BlobBuilder();

bb.append("onmessage = function(e) { postMessage('msg from worker'); }");

// Obtain a blob URL reference to our worker 'file'.

// Note: window.webkitURL.createObjectURL() in Chrome 10+.

var blobURL = window.URL.createObjectURL(bb.getBlob());

var worker = new Worker(blobURL);

worker.onmessage = function(e) {

// e.data == 'msg from worker'

};

worker.postMessage(); // Start the worker.

Blob URLs 在应用程序生命周期内是全局唯一的,所以创建多个blob Urls 节省资源就要及时释放引用。使用方法: window.URL.revokeObjectURL();// window.webkitURL.createObjectURL() in Chrome 10+.

In Chrome, there's a nice page to view all of the created blob URLs: chrome://blob-internals/.


  • ErrorEvent 对象

用法:

worker.addEventListener('error', onError, false);

function onError(e) {

ErrorEvent包含三个字段:

1) filename : 发生错误的worker script文件;

2) lineno : 发生错误的行数;

3) message: 发生错误的信息;


  • 安全问题

workers 脚本文件必须是独立的,与调用页面具有相同的schema的。但是不可以使用data:URL 或者 javascript:URL 来加载脚本。

Https 页面不能启动http的脚本。

chrome浏览器的最新版本不能使用 file:// 来运行本地脚本,会默默的失败。如果要从file:// schema来运行app,使用 --allow-file-access-from-files 设置。 但是不被推荐。

  • 一些推荐的web workers 应用场景

1) 预读取数据

2) 高亮语法或者其他的实时处理文本格式

3) 拼写检查

4) 解析video或者audio数据

5) 后台I/O操作或者轮训处理

6) 处理大的数据

7) <canvas> 标签中的图片过滤

8)更新本地web数据库的多行数据


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值