首页 > 编程语言 >webWorker 开启javascript另外的线程

webWorker 开启javascript另外的线程

时间:2025-01-19 17:57:40浏览次数:3  
标签:postMessage type javascript worker webWorker Worker 线程 message data

javascript是一个单线程语音,因此所有执行代码放在一个线程里面 因此javascriot是从上到小执行代码的,但是遇到大量切繁重的任务例如图形计算 请求,轮询等需要耗时的任务虽然可以使用异步来避免造成页面渲染的阻塞,但是异步任务完成后还要对数据进行处理因此也会导致页面的卡顿,因此可使用worker多开线程解决,让主线程专注于页面的交互和渲染,但是Workers不是越多越好,每个Worker都需要自己的运行环境,这会占用额外的内存;管理多个Worker增加了代码的复杂性,包括Worker的创建、销毁、通信以及错误处理等方面。

示例:一个worker发送两个不同的请求
index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Worker Example</title>
  </head>
  <body>
    <button id="fetch-students">获取学生列表</button>
    <button id="fetch-custom-data">获取自定义数据</button>

    <script>
      const worker = new Worker("worker.js");

      document
        .getElementById("fetch-students")
        .addEventListener("click", () => {
          // 发送消息给worker,指示需要获取学生列表
          worker.postMessage({ action: "studentList" });
        });

      document
        .getElementById("fetch-custom-data")
        .addEventListener("click", () => {
          // 发送消息给worker,指示需要获取自定义数据
          worker.postMessage({ action: "studentOne" });
        });

      worker.onmessage = function (e) {
        const message = e.data;
        if (message.type === "studentList") {
          console.log(message.data);
        } else if (message.type === "studentOne") {
          console.log(message.data);
        }
      };
    </script>
  </body>
</html>

worker
 

// 监听来自主线程的消息
onmessage = function (e) {
  if (e.data.action === "studentList") {
    fetch("http://localhost:5500/students")
      .then((response) => response.json()) // 假设我们期待JSON响应
      .then((data) => {
        // 将从服务器获取的数据发送回主线程,并附带类型信息
        self.postMessage({ type: "studentList", data: data });
      })
      .catch((error) => {
        self.postMessage({ type: "error", message: "请求失败" });
      });
  } else if (e.data.action === "studentOne") {
    fetch("http://localhost:5500/students/1")
      .then((response) => response.json()) // 假设我们期待JSON响应
      .then((data) => {
        // 将从服务器获取的数据发送回主线程,并附带类型信息
        self.postMessage({ type: "studentOne", data: data });
      })
      .catch((error) => {
        self.postMessage({ type: "error", message: "请求失败" });
      });
  }
};

标签:postMessage,type,javascript,worker,webWorker,Worker,线程,message,data
From: https://blog.csdn.net/m0_65227631/article/details/145245166

相关文章

  • Java线程相关知识及线程池学习二
    阻塞队列定义在Java中,阻塞队列(BlockingQueue)是一种线程安全的队列。阻塞队列是Java并发包(java.util.concurrent)中的一个重要组件,常用于生产者-消费者模式中,一个线程产生数据放入队列,另外一个从队列取出数据进行消费。主要有两种情况在尝试添加元素到队列中时,如果队列已......
  • IO进程----线程
    什么是线程概念线程是一个轻量级的进程,为了提高系统的性能引入线程。线程和进程是参与统一的调度。在同一个进程中可以创建的多个线程,共享进程资源。(Linux里同样用task_struct来描述一个线程)进程和线程的区别相同点:都为系统提供了并发执行的能力不同点:调度和资源:......
  • 实例1--C#上位机+后台C应用线程
    实例1C#上位机+后台C应用线程目录实例1C#上位机+后台C应用线程1. 需求1.1 使用场景1.2 关联工具1.3 实例需求概述1.4 实现步骤设计2. C/C++项目2.1 创建项目2.2C/C++代码2.3生成DLL3. C#项目3.1 新建项目3.2窗体UI控件设计3.3C#代码3.4配......
  • Java并发编程——线程池(基础,使用,拒绝策略,命名,提交方式,状态)
    我是一个计算机专业研0的学生卡蒙Camel......
  • JavaScript
    1定义:js是运行在客户端的脚本语言(script是脚本的意思)作用:表单动态校验网页特效服务端开发2区别:HTML/CSS标记语言-描述类语言(html决定网页结构内容css决定网页呈现给用户的模样)JS脚本语言-编程类语言(js实现业务逻辑和页面控制)3浏览器执行js过程:浏览器分为:渲......
  • JavaScript 中的 `findIndex` 方法
    ......
  • 基于C#实现多线程启动停止暂停继续
    大家好!我是付工。大部分初学者在学习C#上位机编程时,多线程是一个很难逾越的鸿沟,不合理地使用多线程,会导致经常出现各种奇怪的问题,这也是很多初学者不敢使用多线程的原因。但是在实际开发中,多线程是一个不可避免的技术栈,基本上每个项目都会使用到,因此学好多线程技术,很重要。一、......
  • 你不知道的javascript-14(Symbol,map,set)
    1.Symbol(生成唯一标识符)Symbol是JavaScript中的一种基本数据类型,它表示唯一的、不可变的值。以下是关于Symbol的详细说明:constsym1=Symbol();constsym2=Symbol("description");使用Symbol()函数可以创建一个新的Symbol。每个Symbol都是唯一的,即使它们的......
  • 你不知道的javascript-13(var的接替者let与const)
    1.let与const的基本使用在ES5中我们声明变量都是使用的var(variable)关键字,从ES6开始新增了两个关键字可以声明变量:let、constlet、const在其他编程语言中都是有的,所以也并不是新鲜的关键字但是let、const确确实实给JavaScript带来一些不一样的东西从使用角度来说,只是在原......
  • JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请
    目录JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)一、什么时候该使用Array.map(),与forEach()的区别是什么?1、什么时候该用Array.map()2、Array.map()与Array.forEach()的......