浅谈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中文字镂空、透明值、阴影效果设置示例小结
Mar 07 HTML / CSS
前端面试必备之CSS3的新特性
Sep 05 HTML / CSS
介绍CSS3使用技巧5个
Apr 02 HTML / CSS
35款精致的 CSS3 和 HTML5 网页模板 推荐
Aug 03 HTML / CSS
CSS伪类与CSS伪元素的区别及由来具体说明
Dec 07 HTML / CSS
详解background属性的8个属性值(面试题)
Nov 02 HTML / CSS
HTML+CSS3+JS 实现的下拉菜单
Nov 25 HTML / CSS
HTML5中的nav标签学习笔记
Jun 24 HTML / CSS
html5 canvas 画图教程案例分析
Nov 23 HTML / CSS
html5小技巧之通过document.head获取head元素
Jun 04 HTML / CSS
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
Aug 18 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
Oct 12 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
967 个函式
2006/10/09 PHP
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
详解jQuery中的easyui
2018/09/02 jQuery
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python中Random和Math模块学习笔记
2015/05/18 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
python区块及区块链的开发详解
2019/07/03 Python
pandas 时间格式转换的实现
2019/07/06 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
python进度条显示之tqmd模块
2020/08/22 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
捐书寄语赠言
2014/01/18 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis