浅谈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自定义滚动条样式写法
Dec 25 HTML / CSS
css3中transition属性详解
Sep 02 HTML / CSS
一款纯css3实现的动画加载导航
Oct 08 HTML / CSS
css3学习系列之移动属性详解
Jul 04 HTML / CSS
浅析CSS3 用text-overflow解决文字排版问题
Oct 28 HTML / CSS
关于HTML5的22个初级技巧(图文教程)
Jun 21 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
Dec 30 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
Jan 10 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
Jul 29 HTML / CSS
使用canvas压缩图片大小的方法示例
Aug 02 HTML / CSS
CSS 实现多彩、智能的阴影效果
May 12 HTML / CSS
css 边框添加四个角的实现代码
Oct 16 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
人族 Terran 基本策略
2020/03/14 星际争霸
php pki加密技术(openssl)详解
2013/07/01 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
jquery操作select大全
2014/04/25 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
微信小程序日历效果
2018/12/29 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
python实现划词翻译
2020/04/23 Python
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
python opencv摄像头的简单应用
2019/06/06 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
python实发邮件实例详解
2019/11/11 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
党员群众路线承诺书
2014/05/20 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
同意转租证明
2015/06/24 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL