在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
提到 HTML5 总是让人津津乐道,太多的特性和有趣的 API 让人耳目一新。但是很多童鞋还停留在语义化的阶段,忽视了 HTML5 的强劲之处。 这节我们来探讨一下多线程 Web-Worker。 一、明确 JavaScript 是单线程 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 听起来有些匪夷所思,为什么不设计成多线程提高效率呢?我们可以假设一种场景: 假定 作为浏览器脚本语言, 这决定了它只能是单线程,否则会带来很复杂的同步问题。为了避免复杂性,从一诞生, 二、新曙光:Web Worker 单线程始终是一个痛点,为了利用多核 所以,这个新标准并没有改变
1.我们可以用 2.可以实现轮询,改变某些状态; 3.页头消息状态更新,比如页头的消息个数通知; 4.高频用户交互,拼写检查,譬如:根据用户的输入习惯、历史记录以及缓存等信息来协助用户完成输入的纠错、校正功能等 5.加密:加密有时候会非常地耗时,特别是如果当你需要经常加密很多数据的时候(比如,发往服务器前加密数据)。 6.预取数据:为了优化网站或者网络应用及提升数据加载时间,你可以使用 来提前加载部分数据以备不时之需。 加密是一个使用 一旦在 Worker 进行计算,它对于用户来说是无缝地且不会影响到用户体验。 三、兼容性 四、基本概念 1.首先记得去判断是否支持 if (window.Worker) { ... } 2.创建一个新的 const myWorker = new Worker('worker.js'); postMessage() 方法和 onmessage 事件处理函数是 Workers 的黑魔法。 3. const worker = new Worker('src/worker.js'); worker.onmessage = e => { console.log(e.data); }; worker.postMessage('你好吗!'); 在主线程中使用时, 4.异常处理: worker.onerror = function(error) { console.log(error.message); throw error; }; 5.终止 worker.terminate();
6.在 close(); 五、快速开始 为了快速掌握,我们来做一个小例子:项目结构如下 ├── index.html └── src ├── main.js └── worker.js Html <html> <head> <title>Web Work Demo</title> <meta charset="UTF-8" /> </head> <body> <div id="app"> Hello Jartto! </div> <script src="src/main.js"></script> </body> </html> main.js const worker = new Worker('src/worker.js'); worker.onmessage = e => { const message = e.data; console.log(`[From Worker]: ${message}`); document.getElementById('app').innerHTML = message; }; worker.postMessage('写的真好!'); Work.js onmessage = e => { const message = e.data; console.log(`[From Main]: ${message}`); if(message.indexOf('好') > -1) { postMessage('谢谢支持'); } }; 代码很简单,主线程发送:「写的真好!」 web worker 收到消息,发现内容中含有「好」字,回传给主线程:「谢谢支持」 六、局限性 1.在 这里举个例子,我们修改 const worker = new Worker('src/worker.js'); worker.onmessage = e => { const message = e.data; console.log(`[From Worker]: ${message}`); document.getElementById('app').innerHTML = message; }; + worker.onerror = function(error) { + console.log(error); + worker.terminate(); + }; worker.postMessage('写的真好!'); 再来修改 + alert('jartto'); onmessage = e => { const message = e.data; console.log(`[From Main]: ${message}`); if(message.indexOf('好') > -1) { postMessage('谢谢支持'); } }; 这时候运行就会报出: 这是因为: 2. 这个过程中数据并不是被共享而是被复制。 3.同源限制 分配给 4.文件限制
5.不允许本地文件
Chrome doesn’t let you load web workers when running scripts from a local file. 那如何解决呢?我们可以启动一个本地服务器,建议使用 6.内容安全策略 有别于创建它的 我们来举个例子,假设一个 Content-Security-Policy: script-src 'self' 这个声明有一部分作用在于,禁止它内部包含的脚本代码使用 为了给 worker 指定 CSP,必须为发送 worker 代码的请求本身加上一个 CSP。 有一个例外情况,即 七、扩展:WorkerGlobalScope 关于 ,我们可以在 1. 我们可以使用 2.
3. 关闭当前线程,与 4. 当前上下文得 5. 支持 6. 7. 8.可以使用:
还有很多 八、异常处理 当 为了防止触发默认动作,worker 可以调用错误事件的 preventDefault() 方法。 错误事件我们常用如下这三个关键信息:
worker.onerror = function(error) { console.log(error.message); throw error; }; 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论