浅谈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 相关文章推荐
CSS实现定位元素居中的方法
Jun 23 HTML / CSS
css3 flex布局 justify-content:space-between 最后一行左对齐
Jan 02 HTML / CSS
CSS3中新增的对文本和字体的设置
Feb 03 HTML / CSS
基于CSS3的animation属性实现微信拍一拍动画效果
Jun 22 HTML / CSS
让IE支持HTML5的方法
Dec 11 HTML / CSS
Html5无刷新修改browser Url的方法
Jan 15 HTML / CSS
HTML5无刷新改变当前url的代码
Mar 15 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
Mar 15 HTML / CSS
HTML5中的拖放实现详解
Aug 23 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
Aug 24 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
Jan 25 HTML / CSS
详解CSS3浏览器兼容
Dec 24 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
长波知识介绍
2021/03/01 无线电
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
vue实现简单计算商品价格
2020/09/14 Javascript
Python创建系统目录的方法
2015/03/11 Python
python 循环while和for in简单实例
2016/08/16 Python
Python中str.format()详解
2017/03/12 Python
单利模式及python实现方式详解
2018/03/20 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Django框架 信号调度原理解析
2019/09/04 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
经典c++面试题四
2015/05/14 面试题
开办加工厂创业计划书
2014/01/03 职场文书
服装创业计划书范文
2014/02/05 职场文书
天猫活动策划方案
2014/08/21 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书