JS的worker

JS的worker

浏览器端js是单线程执行,所以当js执行高负载运算时,UI渲染就会阻塞,页面就会出现卡顿,用户体验就不是很好    js为此也提供了异步操作,
例如: 定时器(setTimeout 和 setInterval),Ajax请求等,但异步终究还是单线程,不能从根本上解决问题,像setTimeout并不能拿到正确的值,因为执行的时候将该任务放到主线程执行,只有当前面的任务执行完才开始执行,所以即使设置时间为0,也并不一定立刻执行   
所以HTML5标准添加了Web Worker,worker允许一段js程序运行在主线程之外的线程,子线程与主线程互不干扰,当子线程的代码执行完成,将结果返回给主线程,主线程接收到相应结果后再做对应处理,
当有一些计算密集型或高延迟的任务就可以交给worker子线程来负担,主线程就不会阻塞
   
   worker是window对象的一个方法,一个worker对象可通过构造函数(window.worker())来创建,创建对象时,需要传给构造函数一个js文件,该文件包含了放到子线程中运行的代码  
    worker通过postMessage()和onmessage = () => {} 来进行通信,主线程和子线程通信是双向的,都有可以发送和接收信息,postMessage传递的数据都是拷贝传递(ArrayBuffer除外)   
    子线程运行耗损系统资源,所以当执行完毕后,我们可以手动关闭子线程    
    在主线程中关闭: worker.terminate()    在子线程中关闭: self.close()  (在子线程中window需改写成self,下文有解释)        worker限制     
1)同源        分配给worker子线程运行的脚本文件,必须与主线程的脚本文件同源,包括协议,域名和端口,不支持本地地址(file://);        
    当使用CDN来存储js文件时,主线程与子线程就会出现跨域        解决方法: 

【1】将子线程的脚本转换成Blod对象                        

【2】然后给Blod对象创建一个URL                        

【3】将这个URL传给worker的构造函数       示例代码:           var workerBlob = new Blob(['(' + function +')()'], { type: "text/javascript" });          var url = window.URL.createObjectURL(workerBlob);          var worker = new Worker(url);    

2) 访问         worker子线程所在的全局对象,与主线程不在一个上下文环境,所以无法读取主线程所在网页的DOM,无法使用document,window,parent这些对象,global指向有变更,window需要改写成self,不能执行alert()comfire()的方法,只能读取部分navigator对象内的数据   


3)使用异步        worker子线程中支持js的异步操作,但仍然不可以跨域     worker的兼容性还不错,但不兼容IE9

总结

例如:以上就是今天要讲的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: JSWorker 是一个 JavaScript 库,它提供了在后台线程中运行 JavaScript 代码的功能,以避免阻塞主线程。以下是 JSWorker 的基本使用方法: 1. 导入 JSWorker 库 ``` import JSWorker from 'jsworker'; ``` 2. 创建一个 worker ``` const worker = new JSWorker(function() { // 这里是 worker 线程的代码 }); ``` 3. 发送消息到 worker 线程 ``` worker.postMessage('Hello, worker!'); ``` 4. 监听来自 worker 线程的消息 ``` worker.onmessage = function(event) { console.log('Received message from worker:', event.data); }; ``` 5. 在 worker 线程中运行代码 在 worker 线程中,可以使用 `self` 或 `this` 来代表当前的 worker 线程。例如: ``` self.addEventListener('message', function(event) { console.log('Received message in worker:', event.data); self.postMessage('Hello, main thread!'); }); ``` 6. 终止 worker 线程 ``` worker.terminate(); ``` 这是一个简单的 JSWorker 的使用示例。请注意,由于 worker 线程不能访问主线程的 DOM 和全局变量等资源,因此在 worker 线程中需要注意避免使用这些资源。 ### 回答2: jsworker是一个用于在后台运行JavaScript的库。以下是使用jsworker的步骤: 1. 首先,您需要在您的项目中引入jsworker库的文件。可以通过在HTML文件中添加script标签来实现,或者使用npm或其他包管理工具进行安装。 2. 在您的JavaScript代码中,创建一个新的Worker对象。使用Worker构造函数,将要加载的JavaScript文件的路径作为参数传递给它。例如:const worker = new Worker('worker.js')。 3. 使用postMessage方法向Worker发送消息。您可以将任何类型的数据发送给Worker,包括数字、字符串、对象等。例如:worker.postMessage('Hello, worker!')。 4. 在Worker脚本中,使用onmessage事件监听来自父线程的消息。您可以在事件处理程序中对接收到的消息进行处理,然后使用postMessage方法将处理结果发送回父线程。例如: worker.onmessage = function(event) { const message = event.data; console.log('Received message from parent:', message); const response = 'Message received: ' + message; postMessage(response); }; 5. 在父线程中,使用onmessage事件监听来自Worker的消息。您可以在事件处理程序中对接收到的消息进行处理。例如: worker.onmessage = function(event) { const message = event.data; console.log('Received message from worker:', message); }; 6. 使用terminate方法终止Worker的执行。当您不再需要Worker时,可以使用该方法进行终止。例如:worker.terminate()。 以上是使用jsworker的基本步骤。通过创建Worker对象、发送消息、监听消息和终止Worker的执行,您可以在后台运行JavaScript代码,从而提高应用程序的性能和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhuaaaa3944210

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值