web worker入门笔记

WebWorker为JavaScript提供多线程环境,允许主线程创建Worker线程处理计算密集型任务,确保UI流畅,同时支持跨域脚本加载及错误处理。主线程与Worker线程通过消息通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web worker

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

Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

注意
  • 同源限制

    分配给worker线程运行的脚本文件,必须与主线程的脚本文件同源。

  • DOM限制

    worker线程无法读取主线程所在网页的DOM对象,也无法使用window、document对象。可以使用navigator、location对象。

  • 通信联系

    worker线程与主线程不在同一个上下文环境,他们之间不能直接通信,必须通过消息进行通信。

  • 注意异步

    worker通信是使用事件监听、异步回调处理的,所以实际使用中需要注意异步的问题。

  • 脚本限制

    worker线程不能执行alert()、confirm()方法,但是可以使用XMLHttpRequest发送ajax请求。

  • 文件限制

    worker无法读取本地文件,他所加载的脚本必须来自网络。

基本用法
主线程
  1. 主线程通过 new Worker() 新建一个worker线程。
  2. 通过worker.postMessage(data)向worker线程发送数据。data可以是各种类型的数据,也可以是二进制的数据。
  3. 通过worker.onmessage = callback接受worker发回的数据。
    var worker = new Worker('worker.js');
    worker.postMessage('hello');
    worker.onmessage = function (e) {
        console.log(e.data);
        worker.terminate();
    }
worker线程
  1. worker线程通过this.onmessage = callback接受主线程传来的数据。this指代子线程本身,也可以使用self.onmessage,也可以省略onmessage
  2. worker线程通过this.postMessage(data)向主线程发送数据。
    this.onmessage = function (e) {
        console.log(e.data);
        this.postMessage('You said: ${e.data}');
    }
worker加载脚本

在worker内部使用importScripts()加载其他脚本。

  • importScripts()可以跨域加载js脚本
  • 通过importScripts()加载的脚本,就像在html里面使用script标签引入的脚本一样,脚本中定义的变量在worker中是全局的。所以需要注意多个脚本中不能有同名的变量。
    importScripts('script1.js');
    // 可以跨域加载脚本
    importScripts('script1.js', 'http://192.168.11.162/script2.js', 'http://192.168.11.162:7070/static/js/script3.js');
错误处理

主线程使用worker.onerror = callback监听worker线程内部发生的错误。

    // 主线程
    worker.onerror = function (e) {
        console.log(e);
    }

worker线程内部也可以监听error事件。

    // worker线程
    onerror = function (err) {
        console.log(err);
    }
关闭worker

为了节省系统资源,使用完毕建议关闭worker。

主线程使用worker.terminate();关闭worker。

worker线程使用this.close();关闭worker。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值