Skip to content

useWorkerFunction

将函数在 Web Worker 中执行,自动处理序列化和通信。

前置依赖

依赖参数

参数名类型说明
deps.WorkerWorkerConstructorWorker 构造函数
deps.BlobWindow['Blob']Blob 构造函数
deps.URLWindow['URL']URL 对象(createObjectURL/revokeObjectURL)
deps.setTimeouttypeof setTimeout设置定时器
deps.clearTimeouttypeof clearTimeout清除定时器

环境要求

  • 浏览器环境: 使用 Web Worker、Blob 和 URL API

函数签名

typescript
function useWorkerFunction<T extends any[], R>(
  fn: WorkerFunction<T, R>,
  options?: WorkerFunctionOptions,
  deps: WorkerFunctionDeps
): {
  execute: (...args: T) => Promise<R>
  terminate: () => void
  status: Ref<WorkerStatus>
}

type WorkerFunction<T extends any[], R> = (...args: T) => R | Promise<R>

interface WorkerFunctionOptions {
  timeout?: number  // 超时时间(毫秒),默认 30000
}

interface WorkerFunctionDeps {
  Worker: WorkerConstructor
  Blob: Window['Blob']
  URL: Window['URL']
  setTimeout: typeof setTimeout
  clearTimeout: typeof clearTimeout
}

参数

参数名类型必填默认值说明
fnWorkerFunction<T, R>-要在 Worker 中执行的函数
options.timeoutnumber30000超时时间(毫秒)
depsWorkerFunctionDeps-依赖注入对象

返回值

类型说明
{ execute, terminate, status }返回执行函数和控制方法

工作原理

  1. 函数序列化

    • 将函数转换为字符串:fn.toString()
    • 创建 Worker 脚本:包装函数并设置消息监听
    • 使用 Blob 和 URL.createObjectURL 创建 Worker URL
  2. 创建 Worker

    • 使用生成的 URL 创建 Worker 实例
    • 设置消息和错误监听器
  3. execute(...args)

    • 将参数通过 postMessage 发送给 Worker
    • Worker 中执行函数
    • 等待 Worker 返回结果
    • 返回 Promise
  4. 结果处理

    • Worker 通过 postMessage 返回结果
    • 主线程接收并 resolve Promise
  5. 错误处理

    • Worker 执行出错时 reject Promise
    • 支持超时控制
  6. 清理

    • terminate() 终止 Worker
    • 释放 Blob URL

无需编写单独的 Worker 文件,直接传入函数即可在后台执行。