什么是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不同访问本地文件,所以会提示错误。

解决方案

  1. npm install -g http-server
  2. 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 入门学习相关推荐

  1. Web前端入门学习(5)——浮动原理及清除浮动

    浮动原理及清除浮动 上节回顾 在上节的<Web前端入门学习(4)-- 块级元素和行内元素之特征与转换>中(http://cherry360.blog.51cto.com/12176744/ ...

  2. Web前端入门学习之JS基础知识梳理汇总

    Web前端工程师是当前各大企业都比较稀缺的人才,薪资待遇和就业前景都很不错.不论是专业还是非专业,有基础亦或是无基础,都想通过学习Web前端实现高薪就业. 不过,学习要一步一个脚印,不能一口吃一个胖子 ...

  3. web前端入门学习 css(1)

    黑马程序员Web前端入门教程,零基础前端视频教程pink老师_html5+css3 文章目录 html局限性 css简介(层叠样式表.级联样式表.css样式表) css语法规范 css代码样式风格(推 ...

  4. web前端入门学习 html5(1)

    web前端入门基础教程,最适合零基础前端小白的视频教程html5+css3 文章目录 html 浏览器内核 web标注 语法规范 html基本结构标签 web常用开发工具 vscode基本使用 文档类 ...

  5. 【css教程】web前端入门学习 css(1)

    黑马程序员Web前端入门教程,零基础前端视频教程pink老师_html5+css3 文章目录 html局限性 css简介(层叠样式表.级联样式表.css样式表) css语法规范 css代码样式风格(推 ...

  6. web前端入门学习(纯干货)

    web前端怎么样才能入门,首先我们要从什么是初级web前端工程师说起: 按照我的想法,我把前端工程师分为了入门.初级.中级.高级这四个级别, 入门级别指的是了解什么是前端(前端到底是什么其实很多人还是 ...

  7. java web开发入门学习笔记(手打超细版)

    我刚实习的时候写的,先分享分享吧,当时写的也不容易.有错的话请指出,博主会修正,适合入门小白当资料使用.包括包括java基础.数据库.js.jQuery.css.html等等知识点. 详细笔记内容如下 ...

  8. web前端入门学习 css(9)广义的html5 品优购项目(html+css基础完结,js开始,移动端布局开始)

    文章目录 广义的html5 品优购项目导读 网站制作流程 原型图 项目规划 项目整体介绍 项目规划 项目搭建 网站favicon图标 网站TDK三大标签SEO优化 品优购首页制作 常用模块类名命名 快 ...

  9. web前端入门学习 css(5)(浮动)(ps切图)(css属性书写顺序)(学成在线网站案例)

    文章目录 传统网页布局的三种方式 标准流(普通流.文档流) 浮动(为什么需要浮动?) 浮动特性 浮动元素会脱离标准流,可以与普通流的元素相重叠 如果多个盒子都设置了浮动,则它们会按照属性值一行内显示并 ...

最新文章

  1. 【我翻译的文章】你还需要数据层吗?
  2. Android使用ActionBar和ViewPager切换页面
  3. d3 力导向图 force graph
  4. 工程优化作业——成功失败法和黄金分割法
  5. 关于c语言中合法的数值常量
  6. OpenCASCADE:形状愈合之修复工具
  7. MyListUtil.java list工具类
  8. int最大值java_Java 中一个int型数组的求最大值最小值 | 学步园
  9. php ajax json post请求参数传递,javascript - ajax post 有个请求参数要用json 但请问js怎么转json的?...
  10. php+js实现弹幕,jquery.barrager.js-专业的网页弹幕插件
  11. java 课后习题 Vector类的 初使用
  12. java 如何判定消息已在队列_【05期】消息队列中,如何保证消息的顺序性?
  13. Script to Setup NTP/DNS/Powerpolicy for new server
  14. 关于Cocos2d-x的动作和动画
  15. DB2数据库下载(v9.7/v10.5/v11.1)
  16. 软件测试方法(单元测试、集成测试、系统测试、确认测试)
  17. 力扣(SQL)584. 寻找用户推荐人
  18. WINVNC(二)omni_thread
  19. Python中的图形绘制——3D绘图
  20. discuz mysql 配置_Discuz如何修改数据库配置?

热门文章

  1. 八大排序算法总结+例题练习(正在不断补充...)
  2. IC验证培训——解读《多线程向量处理器验证技术的研究》
  3. iPhone12和Pro的有什么区别?哪种颜色更好看?
  4. 25664oled模块
  5. 这10个专业,研究生学历收入明显高于本科学历!
  6. 为什么要搞数据库运维平台 附带招聘信息
  7. setInterval与clearInterval
  8. 漫谈广告竞价模式(七)
  9. 比起30岁一事无成更可怕的是:你还在虚度光阴。
  10. 常用的Common助手类文件