问答入门----HTML5 / js多线程
来源:互联网 发布:python日常实用小脚本 编辑:程序博客网 时间:2024/06/06 19:45
主要是讲web worker的啊啊啊啊啊!
能做什么?
1.可以加载一个JS进行大量的复杂计算而不挂起主进程,并通过postMessage,onmessage进行通信
2.可以在worker中通过importScripts(url)加载另外的脚本文件
3.可以使用 setTimeout(), clearTimeout(), setInterval(), and clearInterval()
4.可以使用XMLHttpRequest来发送请求
5.可以访问navigator的部分属性
局限性1.可以加载一个JS进行大量的复杂计算而不挂起主进程,并通过postMessage,onmessage进行通信
2.可以在worker中通过importScripts(url)加载另外的脚本文件
3.可以使用 setTimeout(), clearTimeout(), setInterval(), and clearInterval()
4.可以使用XMLHttpRequest来发送请求
5.可以访问navigator的部分属性
1.不能跨域加载JS
2.worker内代码不能访问DOM
window对象
document对象
parent对象 都不能访问
3.各个浏览器对Worker的实现不大一致,例如FF里允许worker中创建新的worker,而Chrome中就不行
4.不是每个浏览器都支持这个新特性 (IE 11 是支持的, 以下的还没测试)
3.各个浏览器对Worker的实现不大一致,例如FF里允许worker中创建新的worker,而Chrome中就不行
4.不是每个浏览器都支持这个新特性 (IE 11 是支持的, 以下的还没测试)
支持的浏览器包括IE10、Firefox (从3.6版本开始)、Safari (从4.0版本开始)、Chrome 和 Opera 11+,但是手机浏览器还不支持。
5. 带有函数属性的object 对象不能够通过postMessage() 函数传入worker !
需要一个html 两个js , 原理是一个js的事交给另外一个js 去单独悄悄的执行去!
html 代码:
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>js多线程demo</title></head> <script type="text/javascript"> //创建线程对象 var work = new Worker("work.js"); //发送消息,往work.js里面发送! work.postMessage(1000); //监听消息,监听work.js的postMessage() 事件! work.onmessage = function (event) { alert(event.data.age + "," + event.data.name); } </script><body></body></html>
work.js 中的代码:
onmessage = function (event) { var num = event.data; var result = { name: "aa", age: 22 + num }; postMessage(result); close() ; //用以关闭worker ,释放内存! }
其实两个js 是相互监听,相互发送数据的, 这里需要格外注意几点:
1、正如前面所说的,work 读取不到window 对象,所以导致,全局的对象,方法都不能在work中使用,如果想使用的话,只能通过第一个js 文件通过对象属性的方式 将全局对象发送给work.js, 而且,方法不能传入进去, 所以如果有调用相关方法,那么只能再写一遍!
2、如果这个东西仅作为中间步骤执行,那么后续的步骤必须得写到第一个js 中的 onmessage()方法里面,因为这个东西可以理解是异步的,这样的话就是会先执行第一个js 之后的代码,所以后续事情必须写到 onmessage() 函数里面,也就是当work.js有回应之后再执行!
2-2 : 注意, 在worker 内部支持函数,importScripts(); 来引入其他js ,从而实现函数的引入, 通常我们会在worker中引入工具类函数!!!当然这个非常尴尬的一点,比如我们引用了util.js 但是util.js 依赖window 对象,那我们就引用不了了, 所以很多时候我们还是得重新一遍函数!
在portal 中有实际应用: 为支持前端渲染大数据(10W数据量级别),采用的这种方式来优化for 循环带来的浏览器卡死问题!!
当worker 不再使用时, 需要关闭worker ,来节省内存, 关闭worker 的方法有两种:
外部: 也就是第一个js 中, 使用 work..terminate(); 来关闭worker
内部, 使用close() ; 方法来关闭, 推荐使用!
如果像上边的demo那样写,你会发现,ie10 并不支持此功能! 怎么处理?
注意worker.js 中最好这样写:
//写一个自执行函数(function (){//这里的self 可以不写,建议写!指代worker对象// 使用 addEventListener () 代替 onmessage() 提高兼容性self.addEventListener("message", function(event){ var num = event.data.age; var result = { name: "aa", age: 22 + num }; postMessage(result);}, false);})();
阅读全文
0 0
- 问答入门----HTML5 / js多线程
- HTML5 Web Worker实现js多线程操作
- 多线程面试问答
- C++ 入门问答收集
- XML入门问答
- XML入门问答
- 运动控制入门问答
- 问答入门----- web 性能
- HTML5 多线程
- HTML5 多线程
- html5多线程
- 多线程笔试面试概念问答
- 多线程笔试面试概念问答
- 多线程笔试面试概念问答
- 多线程笔试面试概念问答
- 多线程笔试面试概念问答
- 多线程笔试面试概念问答
- 多线程笔试面试概念问答
- Lua基础---运算符
- 安装ElasticSearch过程遇到的坑
- 关于设置背景颜色影响的范围
- 工厂模式
- 基于数组的排序算法
- 问答入门----HTML5 / js多线程
- poll服务器
- mysql 查找具体sql执行性能
- KMP算法的时间复杂度
- TP框架隐藏index.php和Home的访问名
- OpenGL GAO访问冲突(glBindVertexArray)
- Hinton Neural Networks for Machine Learning 第二讲: 感知机-几何描述
- python计算两个地址之间的距离
- [POJ]3164 Command Network 朱刘算法