Web Worker

 

Internet Explorer 10 和使用 JavaScript 的 Windows 应用商店应用引入了对 Web Worker 的支持。Web Worker API 定义了一种在后台运行脚本的方法。 Web Worker 是在万维网联合会 (W3C) 的 Web Worker 规范中指定的。

从传统意义上来说,浏览器是单线程的,它们会强制应用程序中的所有脚本一起在单个 UI 线程中运行。虽然你可以通过使用文档对象模型 (DOM) 事件和setTimeout API 造成一种多个任务同时在运行的假象,但只需一个计算密集型任务就会使用户体验急转直下。

Web Worker API 为 Web 应用程序的创作人员提供了一种方法,用于生成与主页并行运行的后台脚本。你可以一次生成多个线程以用于长时间运行的任务。新的 worker 对象需要一个 .js 文件,该文件通过一个发给服务器的异步请求包含在内。

 
var myWorker = new Worker('worker.js');

往来于 worker 线程的所有通信都通过消息进行管理。主机 worker 和 worker 脚本可以通过 postMessage 发送消息并使用 onmessage 事件侦听响应。消息的内容作为事件的数据属性进行发送。

下面的示例创建一个 worker 线程并侦听消息。

 
var hello = new Worker('hello.js');
hello.onmessage = function(e) {
alert(e.data);
};

worker 线程发送要显示的消息。

 
postMessage('Hello world!');

与 Web Worker 进行双向通信

要建立双向通信,主页和 worker 线程都要侦听 onmessage 事件。在以下示例中,Worker 线程在指定的延迟后返回消息。

首先,该脚本创建 worker 线程。

 
var echo = new Worker('echo.js');
echo.onmessage = function(e) {
alert(e.data);
}

消息文本和超时值在表单中进行指定。当用户单击提交按钮时,脚本会将两条信息以 JavaScript 对象文本的形式传递给 worker。为了防止页面在新的 HTTP 请求中提交表单值,事件处理程序还对事件对象调用 preventDefault。注:你不能将对 DOM 对象的引用发送给 worker 线程。Web Worker 并非可以访问所有数据。只允许访问 JavaScript 基元(例如 Object 或 String 值)。

 
<script>
window.onload = function() {
var echoForm = document.getElementById('echoForm');
echoForm.addEventListener('submit', function(e) {
echo.postMessage({
message : e.target.message.value,
timeout : e.target.timeout.value
});
e.preventDefault();
}, false);
}
</script>
<form id="echoForm">
<p>Echo the following message after a delay.</p>
<input type="text" name="message" value="Input message here."/><br/>
<input type="number" name="timeout" max="10" value="2"/> seconds.<br/>
<button type="submit">Send Message</button>
</form>

最后,worker 侦听消息,并在指定的超时间隔之后将其返回。

 
onmessage = function(e)
{
setTimeout(function()
{
postMessage(e.data.message);
},
e.data.timeout * 1000);
}

在 Internet Explorer 10 和使用 JavaScript 的 Windows 应用商店应用中,Web Worker API 支持以下方法。

方法 描述

void close()

终止 worker 线程。

void importScripts(inDOMString... urls);

导入其他 JavaScript 文件的逗号分隔列表。

void postMessage(在任何数据中);

从 worker 线程发送消息或发送消息到 worker 线程。

Internet Explorer 10 和使用 JavaScript 的 Windows 应用商店应用支持以下 Web Worker API 属性:

属性 类型 描述
location WorkerLocation 代表绝对 URL,包括protocolhostporthostnamepathnamesearch 和 hash 组件。
navigator WorkerNavigator 代表用户代理客户端的标识和 onLine 状态。
self WorkerGlobalScope Worker 范围,包括 WorkerLocation 和 WorkerNavigator 对象。

Internet Explorer 10 和使用 JavaScript 的 Windows 应用商店应用支持以下 Web Worker API 事件:

事件 描述

onerror

出现运行时错误。

onmessage

接收到消息数据。

WindowTimers

Web Worker API 还支持更新的 HTML5 WindowTimers 功能。

方法 描述

void clearInterval(inlonghandle);

取消由句柄所确定的超时。

void clearTimeout(inlonghandle);

取消由句柄所确定的超时。

long setInterval(inanyhandler,inoptionalanytimeoutinany...args);

计划在指定的毫秒数之后重复运行的超时。注:你现在可以将其他参数直接传递到处理程序。如果处理程序是 DOMString,它被编译成 JavaScript。将句柄返回到超时。清除 clearInterval

long setTimeout(inanyhandler,在可选的任何超时中,在任何... 参数中);

计划在指定的毫秒数之后运行的超时。注:你现在可以将其他参数直接传递到处理程序。如果处理程序是 DOMString,它被编译成 JavaScript。将句柄返回到超时。清除 clearTimeout

在 IE10 Platform Preview 4 中对 Web Worker 的更新

Internet Explorer 10 Platform Preview Build 4 添加了每个进程 25 个 Web Worker 线程的限制。你可以在脚本中创建更多的 worker,但同时只有 25 个将处于活动状态。

如果达到最大线程数,创建 worker 将不会引发异常。调用总是成功,你可以添加处理程序并将消息发布给它。但是,在现有的 25 个线程之一变得可用之前,worker 可能不会启动。

 
// Coding pattern before IE10 Platform Preview Build 4
try {
var worker = new Worker(url);
} catch(ex) {
// IE might throw...?
} // After IE10 Platform Preview Build 4
var worker = new Worker(url);
// Continue with confidence...

html5之web worker的更多相关文章

  1. 通过一次实验来了解HTML5的 Web Worker

    web worker 是运行在后台的 JavaScript,不会影响页面的性能. 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 Ja ...

  2. JS利用HTML5的Web Worker实现多线程

    需求:有一个长时间的斐波拉契的计算希望放在分线程中计算,计算的得到结果后再返回给主线程展示,再计算的时候不冻结页面 var number = 55;//传入分线程的参数 var worker = ne ...

  3. html5 web worker学习笔记(记一)

    (吐槽:浏览器js终于进入多线程时代!) 以前利用setTimeout.setInterval等方式的多线程,是伪多线程,本质上是一种在单线程中进行队列执行的方式.自从html5 web worker ...

  4. web worker 简介

    web worker 简介 通常,浏览器执行某段程序的时候会阻塞直到运行结束后在恢复到正常状态,而HTML5的Web Worker就是为了解决这个问题.通过worker线程完成密集计算,避免程序的阻塞 ...

  5. JavaScript多线程之HTML5 Web Worker

    在博主的前些文章Promise的前世今生和妙用技巧和JavaScript单线程和浏览器事件循环简述中都曾提到了HTML5 Web Worker这一个概念.在JavaScript单线程和浏览器事件循环简 ...

  6. 过段时间逐步使用HTML5新增的web worker等内容

    想来快2017年了,2013年前的手机应该很少有人用了,以后逐渐使用HTML5新增的高级API吧. 先把web worker的内容再熟悉一下,因为微软虚拟学院的'面向有经验开发人员的 JavaScri ...

  7. HTML5 Web Worker的使用

    Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面. 一:如何使用Worker Web Wo ...

  8. 深入理解JS异步编程四(HTML5 Web Worker)

    >Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面. 一:如何使用Worker We ...

  9. 深入HTML5 Web Worker应用实践:多线程编程

    HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越多崭新的特性和功能.它不但强化了 Web 系统或网页的表现性能 ...

随机推荐

  1. GFF 和 OGS 这两种触摸屏谁更好?

    我将从成本分析.制程分析.用户体验三个方面来回答楼主的问题.GFF的触摸屏从字面上翻译过来,就是一层玻璃cover,两层film构成的触摸屏.其中,玻璃cover作为整个手机的coverlens,从外 ...

  2. windows下bat批处理实现守护进程(有日志)

    开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windo ...

  3. POJ 1704 Georgia and Bob (Nim游戏变形)

    题目:http://poj.org/problem?id=1704 思路:Nim游戏策略,做如下转换,如果N是偶数,则两两配对,将两个数之间的格子数(距离)看做成这一堆石头的数量. 如果N是奇数,则将 ...

  4. Codec plugins ? multiline

    Codec plugins ? multiline multiline codec 会折叠多行消息,合并它们到一个事件 这个codec 原始的目的是允许 连接多行信息从文件到一个单独的事件. 比如, ...

  5. ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。

    官方文档:https://msdn.microsoft.com/zh-cn/library/system.obsoleteattribute(v=vs.110).aspx 备注 ObsoleteAtt ...

  6. G - Island Transport - hdu 4280(最大流)

    题意:有N个岛屿,M条路线,每条路都连接两个岛屿,并且每条路都有一个最大承载人数,现在想知道从最西边的岛到最东面的岛最多能有多少人过去(最西面和最东面的岛屿只有一个). 分析:可以比较明显的看出来是一 ...

  7. 【COM学习】之一、QueryInterface

    开始先说一句,学习com之前要学好c++ 对象模型. QueryInterface的使用: QueryInterface是IUnknown的一个成员函数,客户可以通过此函数来查询某个组件是否支持某个特 ...

  8. QT5 TK1 串口通信

    对TK1中基于QT5的串口通信过程进行总结.按照软件安装及通信实现的顺序. 1.QT5安装 较简洁方式:打开软件中心(类似A形),搜索qtcreator,点击安装即可. 2.串口通信库安装 采用上述方 ...

  9. springmvc对jsonp的支持

    在与前端开发人员合作过程中,经常遇到跨域名访问的问题,通常我们是通过jsonp调用方式来解决.jsop百科:http://baike.baidu.com/link?url=JKlwoETqx2uuKe ...

  10. JS~字符串长度判断,超出进行自动截取(支持中文)

    今天一个小弟问我的问题,在文本框中输入字符,如果超出指定长度,就把它截取,要求中文等于两个字符的长度,我找一下资料,把这个功能实现了,下面是JS代码: <html> <script ...