浅谈Html5多线程开发之WebWorkers


Posted in HTML / CSS onMay 02, 2018

我们都知道,浏览器执行js代码是单线程的,当页面脚步执行时,页面是没办法响应别的的,直到脚步的结束,而这里介绍的WebWorkers就可以改变这一切。

WebWorkers是运行在后台的js代码,独立于其他脚本,不会影响页面的性能。我们可以继续做任何愿意做的事情:点击、选取内容等等,而此时WebWorkers在后台运行。

所有主流浏览器均支持 web worker,除了 Internet Explorer。

第一步:生成worker。

调用Worker()构造函数,指定一个要在worker线程内运行的脚本的URI,例子是当前页面指定worker线程执行的脚步为script-worker.js。

var myWorker = new Worker("script-worker.js");

在script-worker.js里面我们可以执行额外的代码,这些代码的执行不会影响页面去干别的你想干的事情,这听起来很棒。

第二步:传递数据。

页面可以和worker交互传递数据,这样worker在不影响页面干有意义的事情的情况下可以默默去计算,好了告诉一下页面,使用这些数据。

//[主页面代码]
myWorker.postMessage("data-from-mainpage");

//[worker代码]
onmessage = function (oEvent) {

    console.log("主页面发送过来的数据是:"+oEvent.data));    
};

上面是【主页面发送数据给worker脚本】的情况,是的,你看见了非常亲切的postMessage,好吧,我喜欢这个东西。

//[主页面代码]
 myWorker.onmessage = function (oEvent) {
 
     console.log("worker脚本发送过来的数据是:"+oEvent.data));
     
 }; 
//[worker代码]
postMessage("data-from-mainpage");

上面是【worker脚本发送数据给主页面】的情况,依旧很简单,不过这些只是API,关键在于巧妙的使用才是有益的。

此外,可能worker执行会出错,主页面通过:

myWorker.onerror=function(oEvent){};

可以监听worker发生错误。

第三步:重要几点。

worker线程能够在不干扰UI的情况下执行任务,所执行的JavaScript代码完全在另一个作用域,与当前网页中的代码不共享作用域。

Worker的全局作用域中提供了importScripts()方法,接收一个或多个指向JavaScript文件的URL,加载过程都是异步进行。

importScripts()只会在您提供绝对URI的情况下生效,执行过程也是异步的。

当我们创建WebWorkers对象后,它会继续监听消息(即使在外部脚本完成之后)直到其被终止为止,使用myWorker.terminate()方法可以终止WebWorkers,并释放浏览器/计算机资源。

第四步:重要限制。

1.无法访问DOM节点,无法访问全局变量或是全局函数,法调用alert()或者confirm之类的函数和无法访问window、document之类的浏览器全局变量;

2.不过Web Worker中的Javascript依然可以使用setTimeout(),setInterval()之类的函数,也可以使用XMLHttpRequest对象来做Ajax通信。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
使用CSS3的rem属性制作响应式页面布局的要点解析
May 24 HTML / CSS
利用CSS3实现单选框动画特效示例代码
Sep 26 HTML / CSS
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
Aug 15 HTML / CSS
css3如何绘制一个圆圆的loading转圈动画
Jan 09 HTML / CSS
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
Feb 07 HTML / CSS
CSS实现雨滴动画效果的实例代码
Oct 08 HTML / CSS
基于html5绘制圆形多角图案
Apr 21 HTML / CSS
浅析HTML5中的download属性使用
Mar 13 HTML / CSS
详解canvas.toDataURL()报错的解决方案全都在这了
Mar 31 HTML / CSS
使用css样式设计一个简单的html登陆界面的实现
Mar 30 HTML / CSS
CSS3 天气图标动画效果
Apr 06 HTML / CSS
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
Apr 13 HTML / CSS
html5的input的required使用中遇到的问题及解决方法
Apr 24 #HTML / CSS
HTML5轻松实现全屏视频背景的示例
Apr 23 #HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
Apr 23 #HTML / CSS
HTML5拖拽API经典实例详解
Apr 20 #HTML / CSS
HTML5中的Web Notification桌面右下角通知功能的实现
Apr 19 #HTML / CSS
HTML5实现移动端复制功能
Apr 19 #HTML / CSS
canvas实现漂亮的下雨效果的示例
Apr 18 #HTML / CSS
You might like
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
js multiple全选与取消全选实现代码
2012/12/04 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
原生js实现日历效果
2020/03/02 Javascript
js实现微信聊天界面
2020/08/09 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
python中list列表的高级函数
2016/05/17 Python
python批量修改图片大小的方法
2018/07/24 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
大学生求职自荐信
2013/12/12 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
辩论赛主持词
2014/03/18 职场文书
项目建议书怎么写
2014/05/15 职场文书
施工安全标语
2014/06/07 职场文书
领导班子整改措施
2014/10/24 职场文书
白银帝国观后感
2015/06/17 职场文书
课题研究阶段性总结
2015/08/13 职场文书