Web Workers 入门学习
什么是Web Workers?
Web Workers是HTML5提供的一个JavaScript多线程解决方案。
实例说明
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Web Workers Study</title>
</head>
<body><input type="text" placeholder="数值" id="num"><button id="btn">计算</button><script>// 1 1 2 3 5 8 13 21 f(n) = f(n-1) + f(n-2)function fibonacci(n) {return n<=2 ? 1 : fibonacci(n-1)+fibonacci(n-2);}var input = document.getElementById("num");document.getElementById('btn').onclick = function() {var number = input.value;var result = fibonacci(number);var t = Date.now();alert(result);console.log(Date.now() - t);}</script>
</body>
</html>
网页输入一个数字12,弹出框显示结果为144,Console窗口显示运行时间为890毫秒。
如果输入数字50,则要过1.7分钟才会出现弹出窗口显示结果12586269025。在1.7分钟期间,页面处于“计算状态”,不能在输入框输入数字。
Web Workers解决尴尬
Web Workers将负责该计算,同时不冻结页面(计算的同时可以在输入框输入数字)。
Web Workers负责的计算属于子线程,子线程受控于主线程,且不得操作DOM。因此,该标准没有改变JS单线程的本质。
以上代码通过Web Wokers处理,实际代码如下显示:
- WebWorkers.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Web Workers Study</title><!-- <script type="text/javascript" src="work.js"></script> -->
</head>
<body><input type="text" placeholder="数值" id="num"><button id="btn">计算</button><script type="text/javascript">var input = document.getElementById("num");document.getElementById('btn').onclick = function() {var number = input.value;// 创建一个worker对象var worker = new Worker('worker.js');// 向分线程发送消息worker.postMessage(number);console.log('主线程向分线程发送数据' + number);// 绑定接收消息监听(异步事件,位置放在那里没关系)worker.onmessage = function (event) {console.log('主线程接收分线程返回的结果' + event.data);alert(event.data);}}</script>
</body>
</html>
- woker.js
在浏览器中输入file:///c:/SuniorYang/iLearn/js/WebWorkers.html,输入数字12,点击“计算”,报错!!
Uncaught DOMException: Failed to construct 'Worker': Script at 'file:///C:/SuniorYang/iLearn/js/worker.js' cannot be accessed from origin 'null'.
at HTMLButtonElement.document.getElementById.onclick (file:///C:/SuniorYang/iLearn/js/WebWorkers.html:18:26)
document.getElementById.onclick @ WebWorkers.html:18
因为worker不同访问本地文件,所以会提示错误。
解决方案
- npm install -g http-server
- http-server
启动http-server之后,在浏览器输入http://127.0.0.1:8080/js/WebWorkers.html,输入数字12,点击“计算”
页面响应时间较短,可以正常弹出计算结果和打印消息。如果输入数字50,则计算时间较长。
计算期间,可以在页面输入新数字52。
图解代码执行过程
、
worker任务作为异步任务存放在消息队列中,等待执行栈中的主线程为后返回异步执行结果。应用:城市下拉列表选择某一城市后,位于该城市下面的乡镇对加载显示。
Web Workers不足
- 不足一:运行比较慢
使用分线程,不是因为速度快,而是因为不堵塞主线程,不冻结主界面
- 不足二:worker内代码不能访问DOM
worker.js
// 1 1 2 3 5 8 13 21 f(n) = f(n-1) + f(n-2)
function fibonacci(n) {return n<=2 ? 1 : fibonacci(n-1)+fibonacci(n-2);
}var onmessage = function(event) { // 不能用函数声明var number = event.data; // 通过event获得主线程发送来的数据console.log('分线程接收到主线程发送的数据:' + number);var result = fibonacci(number);postMessage(result); // 将获取到的数据发送给主线程console.log('分线程向主线程返回数据:'+result);alert(result);
}
alert(result); 无法运行。console是浏览器方法,与window无关。
alert是window的方法,在分线程中无法使用。分线程对象不是window,所有分线程无法更新界面。
这就是与JS是单线程不冲突的原因。
- 不足三:不能跨域访问
跨域:www.baidu.com,通过baidu.com访问 sina.com
参考链接:
web work: https://www.bilibili.com/video/av83803819/
Web Workers 入门学习相关推荐
- Web前端入门学习(5)——浮动原理及清除浮动
浮动原理及清除浮动 上节回顾 在上节的<Web前端入门学习(4)-- 块级元素和行内元素之特征与转换>中(http://cherry360.blog.51cto.com/12176744/ ...
- Web前端入门学习之JS基础知识梳理汇总
Web前端工程师是当前各大企业都比较稀缺的人才,薪资待遇和就业前景都很不错.不论是专业还是非专业,有基础亦或是无基础,都想通过学习Web前端实现高薪就业. 不过,学习要一步一个脚印,不能一口吃一个胖子 ...
- web前端入门学习 css(1)
黑马程序员Web前端入门教程,零基础前端视频教程pink老师_html5+css3 文章目录 html局限性 css简介(层叠样式表.级联样式表.css样式表) css语法规范 css代码样式风格(推 ...
- web前端入门学习 html5(1)
web前端入门基础教程,最适合零基础前端小白的视频教程html5+css3 文章目录 html 浏览器内核 web标注 语法规范 html基本结构标签 web常用开发工具 vscode基本使用 文档类 ...
- 【css教程】web前端入门学习 css(1)
黑马程序员Web前端入门教程,零基础前端视频教程pink老师_html5+css3 文章目录 html局限性 css简介(层叠样式表.级联样式表.css样式表) css语法规范 css代码样式风格(推 ...
- web前端入门学习(纯干货)
web前端怎么样才能入门,首先我们要从什么是初级web前端工程师说起: 按照我的想法,我把前端工程师分为了入门.初级.中级.高级这四个级别, 入门级别指的是了解什么是前端(前端到底是什么其实很多人还是 ...
- java web开发入门学习笔记(手打超细版)
我刚实习的时候写的,先分享分享吧,当时写的也不容易.有错的话请指出,博主会修正,适合入门小白当资料使用.包括包括java基础.数据库.js.jQuery.css.html等等知识点. 详细笔记内容如下 ...
- web前端入门学习 css(9)广义的html5 品优购项目(html+css基础完结,js开始,移动端布局开始)
文章目录 广义的html5 品优购项目导读 网站制作流程 原型图 项目规划 项目整体介绍 项目规划 项目搭建 网站favicon图标 网站TDK三大标签SEO优化 品优购首页制作 常用模块类名命名 快 ...
- web前端入门学习 css(5)(浮动)(ps切图)(css属性书写顺序)(学成在线网站案例)
文章目录 传统网页布局的三种方式 标准流(普通流.文档流) 浮动(为什么需要浮动?) 浮动特性 浮动元素会脱离标准流,可以与普通流的元素相重叠 如果多个盒子都设置了浮动,则它们会按照属性值一行内显示并 ...
最新文章
- 【我翻译的文章】你还需要数据层吗?
- Android使用ActionBar和ViewPager切换页面
- d3 力导向图 force graph
- 工程优化作业——成功失败法和黄金分割法
- 关于c语言中合法的数值常量
- OpenCASCADE:形状愈合之修复工具
- MyListUtil.java list工具类
- int最大值java_Java 中一个int型数组的求最大值最小值 | 学步园
- php ajax json post请求参数传递,javascript - ajax post 有个请求参数要用json 但请问js怎么转json的?...
- php+js实现弹幕,jquery.barrager.js-专业的网页弹幕插件
- java 课后习题 Vector类的 初使用
- java 如何判定消息已在队列_【05期】消息队列中,如何保证消息的顺序性?
- Script to Setup NTP/DNS/Powerpolicy for new server
- 关于Cocos2d-x的动作和动画
- DB2数据库下载(v9.7/v10.5/v11.1)
- 软件测试方法(单元测试、集成测试、系统测试、确认测试)
- 力扣(SQL)584. 寻找用户推荐人
- WINVNC(二)omni_thread
- Python中的图形绘制——3D绘图
- discuz mysql 配置_Discuz如何修改数据库配置?