JavaScript---Web Worker使用教程

简介

web worker 是运行在后台的 JavaScript,不会影响页面的性能。例如处理类似<a href="blog.csdn.net/c_kite/article/details/69415183">高斯函数处理图片</a>这种处理信息量比较庞大时有可能会造成页面阻塞, 因此这种时候就可以通过Worker创建一个线程在后台处理信息, 当处理完成时会把信息返回回来.

兼容性

Internet Explorer 10, Firefox, Chrome, Safari 和 Opera 都支持Web workers.


这里写图片描述
这里写图片描述

Worker运行环境

  • 一个navigator对象, 只包含四个属性: appName, appVersion, userAgent和platform
  • 一个location对象(与window.location相同), 不过所有属性都是只读
  • 一个self对象, 指向全局worker对象.
  • 一个importScripts( )方法, 用来加载Worker所用到的外部javascript文件
  • 所有的ECMAScript对象, 诸如: Object, Array, Date等.
  • XMLHTTPRequest构造器
  • setTimeout( ) 和 setInterval( )
  • 一个close( )方法, 它能立刻停止worker运行

由于Web Worker有着不同的全局环境, 因此你无法出从Javascript代码中创建它. 事实上, 你需要创建一个完全独立的JavaScript文件, 其中包含了需要在Worker中运行的代码. 要创建网页人工线程, 你必须传入这个Javascript文件的URL:

var worker = new Worker("code.js");

此代码一旦执行, 将为这个文件创建一个新的线程和一个新的Worker运行环境. 该文件会被异步下载, 直到文件下载并执行完成后才会启动此Worker

与Worker通信

worker与网页代码通过事件接口进行通信. 网页代码可以通过postMessage( )方法给worker传递数据, 它接收一个参数, 即需要传递给Worker的数据. 此外, Worker还有一个用来接收信息的onmessage事件处理器. 例如:

var worker = new Worker("code.js");
worker.onmessage = function(event) {
    alert(event.data);
}
worker.postMessage("Hi");

Worker通过触发message事件来接收数据. 定义onmessage事件处理器之后, 该事件对象具有一个data属性用于存放传入的数据. Worker可通过它自己的postMessage( )方法把信息传给页面:

//code.js内部代码
//self是全局worker对象
self.onmessage = function(event) {
    self.postMessage("Hello!");
}

加载外部文件

importScripts( )的调用过程是阻塞的, 直到所有文件加载并执行完成之后, 脚本才会继续运行. 由于Worker在UI线程之外运行, 所以这种阻塞并不会影响UI响应.

//code.js内部代码
importScripts("file1.js", "file2.js");

self.onmessage = function( ) {

}

实际应用

Web Worker适用于那些处理纯数据, 或者与浏览器UI无关的长时间运行脚本.

例: 解析一个很大的JSON字符串, 正常执行需大概500毫秒, 因此这时可以使用Web Worker. 见下方代码.

var worker = new Worker("code.js");

//数据就位时, 调用事件处理器
worker.onmessage = function(event) {
    
    //JSON结构被回传回来
    var jsonData = event.data;

    //使用JSON
    execute(jsonData);
}

//传入要解析的大段JSON字符串
worker.postMessage(jsonText);




//code.js文件内部代码, worker解析
self.onmessage = function(event) {
    //JSON字符串由event.data传入

    //解析
    var jsonData = JSON.parse(jsonText);

    //回传结果
    self.postMessage(jsonData);
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,876评论 25赞 708
  • UIMenuController:如图显示 要使用UIMenuController 需要满足一个条件:这个控件可以...
    面朝对象_春暖花开阅读 131评论 0赞 0
  • 1.两位天使来到所多玛,罗得摆设宴席款待他们 2.所多玛的男人围住罗得的家,嚷着罗得交出那两人 3.罗得不让,众人...
    瓦登之湖阅读 9,301评论 0赞 1
  • 有一个未来的目标 总能让我们欢欣鼓舞 就像飞向火光的灰蛾 甘愿做烈焰的俘虏 摆动着的是你不停的脚步 飞旋着的是你美...
    何好00阅读 222评论 0赞 1

友情链接更多精彩内容