当前位置:首页 > javascript > 正文内容

JS 多线程 web worker 基本使用

hxing64111个月前 (01-16)javascript4341

简介:

JS 是单线程,所有的任务都是在一个线程中完成的,也就是说,只能同时执行一个任务,因此有时多个任务同时进行的时候,会阻塞,比如UI会一直在渲染,同时还要进行复杂逻辑的处理,这时候我们就要使用多线程 worker


Worker的作用:

就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。


下面是 JavaScript Worker 的详细使用步骤:

创建 Worker 对象

在主线程中创建 Worker 对象,传入一个 JavaScript 文件的 URL,该文件会在 Worker 线程中运行。

const worker = new Worker('worker.js');


创建 Message 事件监听器

在主线程中为 Worker 对象添加 message 事件监听器,用于接收 Worker 线程发送的消息。

worker.addEventListener('message', (event) => {
  console.log('Received message from worker:', event.data);
});


发送消息给 Worker 线程

在主线程中通过 postMessage() 方法向 Worker 线程发送消息。

worker.postMessage({type: 'calculate', data: [1, 2, 3]});


在 Worker 线程中处理消息

在 Worker 线程中为 self 对象添加 message 事件监听器,用于接收主线程发送的消息。

self.addEventListener('message', (event) => {
  if (event.data.type === 'calculate') {
    const result = calculate(event.data.data);
    self.postMessage({type: 'result', data: result});
  }
});
function calculate(data) {
  return data.reduce((a, b) => a + b);
}


发送消息给主线程

在 Worker 线程中通过 postMessage() 方法向主线程发送消息。

self.postMessage({type: 'result', data: result});


需要注意的是,Worker 线程中不能直接操作 DOM,因为它们没有访问主线程的权限。如果需要操作 DOM,可以在 Worker 线程中处理数据,然后将处理结果通过 postMessage() 方法发送给主线程,在主线程中更新 DOM。


除了使用 JavaScript 文件创建 Worker 对象,还可以使用 Blob 对象或者 Data URL 创建 Worker 对象。Blob 对象可以动态生成 JavaScript 代码,Data URL 可以将 JavaScript 代码转换为 Base64 编码,并以字符串形式传递给 Worker 对象。


扫描二维码推送至手机访问。

版权声明:本文由星星博客发布,如需转载请注明出处。

本文链接:http://xingxinghan.cn/?id=514

分享给朋友:

“JS 多线程 web worker 基本使用” 的相关文章

js fetch方法使用

// get请求,第一个参数是请求地址,第二个可选,默认发送的是get请求 fetch('/api/user/list').then(res => {     res.json().then(data&n...

JS逆向实战20——深入解析JavaScript虚拟机逆向工程

在Web开发领域中,JavaScript(JS)是一门广泛使用的编程语言。然而,由于其脚本性质和开放性,JavaScript代码的安全性一直备受关注。为了保护知识产权和提高代码的安全性,一些开发者会将JavaScript代码进行加密和混淆。这就需要逆向工程师掌握JS逆向技术来还原加密和混淆后的代码。...

JS数组常用方法

JS数组常用方法

JS数组常用方法:1.数组的复制和填充批量复制方法 copyWithin(),以及填充数组方法fill()。这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。使用这个方法不会改变数组的大小。 1.1.fill()方法使用fill()方法可以向一个已...

typescript 中 omit 的理解

在 TypeScript 中,Omit 是一种非常有用的工具类型,它可以用于创建一个新的类型,这个新类型是从现有类型中排除了指定的属性后得到的。如果你想要处理一个对象但又不需要包含某些属性,那么 Omit 可以帮助你快速地创建一个新的类型。 比如说,...

微前端使用: qiankun

微前端使用: qiankun

一、qiankun使用场景1. 简介qiankun是在single-spa的基础上实现的,可以保证各个项目独立使用,也可以集成使用。各系统之间不受技术栈的限制,集成使用也能保证各样式和全局变量的隔离。模块的插拔式使用,当公司项目集是一个大系统下包含多个子系统或者模块时,可以采用这种方式动态部署各个系...

js字符串总结

ES5和字符串 一、ES5的语法 js在产生的时候,年代比较早,当时的web需求比较少,所以刚开始的js功能比较少,语法没有特别严谨。随着时代的发展和web应用的普及,js需要更多的功能,以及更严谨的语法,所以,js会有版本的升级。第一版的js是ECM...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。