Web Workers详解
一、背景
随着 Web 应用复杂性的与日俱增,越来越复杂的计算在所难免。长时间运行的 JavaScript 进程会导致浏览器冻结用户界面,让人感觉屏幕 “冻结” 了。Web Workers 规范通过让 JavaScript 在后台运行解决了这个问题。
二、使用 Worker
实例化 Worker 对象并传入要执行的 JavaScript 文件名就可以创建一个新的 Web Workers。
let worker = new Worker('stufftodo.js');
这行代码会导致浏览器下载 stufftodo.js,但只有 Worker 接收到消息才会实际执行文件中的代码。
要给 Worker 传递消息,可以使用 postMessage() 方法(与 XDM 中的 postMessage() 方法类似);
worker.postMessage('start!');
消息内容可以是任何能够被序列化的值,不过与 XDM 不同的是,在所有支持的浏览器中, postMessage() 都能接收对象参数,因此可以随便传递任何形式的对象数据:
werker.postMessage({type: 'command',message: 'start!'
})
一般来说,可以序列化为 JSON 结构的任何值都可以作为参数传递给 postMessage(). 换句话说,这就意味着传入的值是被复制到 Worker 中, 而非直接传过去的(与XDM类似)。
Worker 是通过 message 和 error 事件与页面通信的。这里的 message 事件与 XDM 中的 message 事件行为相同,来自 Worker 的数据保存在 event.data 中。 Worker 返回的数据也可以是任何能够被序列化的值:
worker.onmessage = function(event) {let data = event.data// 对数据进行处理
}
Worker 不能完成给定的任务时会触发 error 事件。具体来说, Worker 内部的 JavaScript 在执行过程中只要遇到错误,就会触发 error 事件。发生 error 事件时,事件对象中包含三个属性: filename、lineno 和 message, 分别表示发生错误的文件名、代码行号和完整的错误消息。
worker.onerror = function(event) {console.log(`ERROR ${event.filename} (${event.lineno}): ${event.message}`);
};
建议大家使用 Web Workers时,始终都要使用 onerror 事件处理程序, 即使这个函数除了把错误记录到日志中什么也不做都可以。否则, Worker 就会在发生错误时,悄无声息的失败了。
任何时候,只要调用 terminate() 方法就可以停止 Worker 的工作。而且,Worker 中的代码会立即停止执行,后续的所有过程都不会在发生(包括 error 和 message 事件也不会再触发)。
worker.terminate(); // 立即停止 Worker 的工作
三、Worker 全局作用域
关于 Web Worker, 最重要的是要知道它所执行的 JavaScript 代码完全在另一个作用域中,与当前网页中的代码不共享作用域。在 Web Worker 中,同样有一个全局对象和其他对象以及方法。但是,Web Worker 中的代码不能访问 DOM, 也无法通过任何方式影响页面的外观。
Web Worker 中的全局对象是 worker 对象本身。也就是说,在这个特殊的全局作用域中, this 和 self 引用的都是 Worker 对象。为便于处理数据,Web Worker 本身也是一个最小化的运行环境。
- 最小化的 navigator 对, 包括 onLine、appName、appVersion、userAgent 和 platform 属性;
- 只读的 location 对象;
- setTimeout()、setInterval()、clearTimeout() 和 clearInterval() 方法;
- XMLHttpRequest 构造函数。
显然,Web Worker 的运行环境与页面环境相比,功能是相当有限的。
当页面在 worker 对象上调用 postMessage() 时,数据会以异步方式被传输给 worker, 进而触发 worker 中的 message 事件。为了处理来自页面的数据,同样也需要创建一个 onmessage 事件处理程序。
// Web Worker 内部的代码
self.onmessage = function(event) {let data = event.data;// 处理数据
}
大家看清楚,这里的 self 引用的是 Worker 全局作用域中的 worker 对象(与页面中的 Worker 对象不同一个对象)。Worker 完成工作后,通过调用 postMessage() 可以把数据再发回页面。下面的例子假设需要 Worker 对传入的数组进行排序,而 Worke 在排序之后又将数组发回了页面:
// Web Worker 内部的代码
self.onmessage = function(event) {let data = event.data;// 别忘了,默认的 sort() 方法只比较字符串data.sort(function(a, b) {return a - b;})self.postMessage(data);
}
传递消息就是页面与 Worker 相互之间通信的方式。在 Worker 中调用 postMessage() 会以异步方式触发页面中 Worker 实例的 message 事件,如果页面想要使用这个 Worker, 可以这样:
// 在页面中
let data = [23, 4, 7, 9, 2, 14, 6, 651, 87, 41, 7798, 24],worker = new Worker('webWorkerExample01.js');Worker.onmessage = function(event) {let data = event.data;// 对排序后的数组进行排序
};// 将数组发送给 worker 排序
worker.postMessage(data);
排序的确是比较消耗时间的操作,因此转交给 Worker 做就不会阻塞用户界面了。另外,把彩色图像转换成灰阶图像以及加密解密之类的操作也是相当费时的。
在 Worker 内部,调用 close() 方法也可以停止工作。就像在页面中调用 terminate() 方法一样,Worker 停止工作后就不会再有事情发生了。
// Web Worker 内部的代码
self.close();
四、包含其他脚本
Web Workers详解相关推荐
- (ASA) Cisco Web ××× 配置详解 [三部曲之一]
(ASA) Cisco Web ××× 配置详解 [三部曲之一] 注意:本文仅对Web×××特性和配置作介绍,不包含SSL ×××配置,SSL ×××配置将在本版的后续文章中进行介绍. 首先,先来 ...
- Stuts的Web.xml 详解
1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用 ...
- 用python写一个简单的爬虫_Python实现简易Web爬虫详解
编辑推荐: 本文主要介绍了Python实现简易Web爬虫详解,希望对大家有帮助. 本文来自于脚本之家 ,由火龙果软件Alice编辑,推荐. 简介: 网络爬虫(又被称为网页蜘蛛),网络机器人,是一种按照 ...
- [面试专题]Web缓存详解
Web缓存详解 标签(空格分隔): 缓存 缓存之于性能优化 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度. 降低服务器压力: ...
- Web.xml详解(转)
这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论. ---题记 一. Web.xml详解: (一) web.xml加载过程(步骤) 首 ...
- Mac下Intellij IDea发布Web项目详解一
Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...
- (转)asp.net夜话之十一:web.config详解
在开发中经常会遇到这样的情况,在部署程序时为了保密起见并不将源代码随项目一同发布,而我们开发时的环境与部署环境可能不一致(比如数据库不一样),如果在代码中保存这些配置这些信息部署时需要到用户那里更改代 ...
- Web.config详解+asp.net优化(1)
一.认识Web.config文件 Web.config 文件是一个xml文本文件,它用来储存 asp.NET Web 应用程序的配置信息(如最常用的设置asp.NET Web 应用程序的身份验证方式) ...
- Web.config详解+asp.net优化
Web.config详解+asp.net优化(1) 一.认识Web.config文件 Web.config 文件是一个xml文本文件,它用来储存 asp.NET Web 应用程序的配置信息(如最常用的 ...
最新文章
- ionic开发:第一步
- rs 实用工具 (rs.exe) (SSRS)SQL server report service
- servlet需要和ajax,如何使用Servlet和Ajax?
- toad查看oracle的plsql包,Oracle logminer 分析redo log(TOAD与PLSQL)
- Codeforces Round #182 (Div. 1)题解【ABCD】
- W25Q128 闪存芯片SPI详解
- 现控笔记(三):状态空间表达式的解
- eja智能压力变送器工作原理_eja变送器详解_eja变送器工作原理_eja变送器如何选型...
- css border-image 图片边框
- excel转置怎么操作_EXCEL技巧-行列快速转换
- Ubuntu 18.04 chia 远程收割机 harvester 多台
- OM_销售订单的四个主要环节和每个环节用到的常用表
- L2~L5泊车场景泊车功能演进
- java实现福利彩票抽奖_【福利】快来参与抽奖获得《Java程序设计》
- SQL Server 2012 SP1 补丁发布
- python 发送邮件附件很慢_python发送邮件附件
- Windows 平台部署前后端分离项目
- 孙剑:如何打造云、端、芯上的视觉计算 | CCF-GAIR 2018
- 免费的python编辑器_免的解释|免的意思|汉典“免”字的基本解释
- linux的自动挂载
热门文章
- 4 win10环境下+vs2017+pcl1.9环境配置
- 【Javascript 基础】课堂笔记1
- (ROC-RK3568-PC) 裸机24_驱动VOP2显示自绘画面
- 图像分类篇:pytorch实现ResNet
- 【读书笔记】《读懂一本书》——如何读书不枯燥,读得懂,记得住
- 为什么usb计算机连接无法识别,无法识别usb设备,教您电脑出现无法识别usb设备怎么办...
- 如何删除多个计算机名称,电脑双系统怎么删除一个呢?教你快速删除
- 通过Excel制作下拉框筛选出成绩
- k8s中的Secret
- 域控服务器组策略管理找不到网络,组策略找不到域服务器解决方法重建SYSVOL和NETLOGON共享...