Skip to content

createInterruptibleTask

创建可中断的异步任务,支持暂停、恢复、取消和进度跟踪。

前置依赖

依赖参数

参数名类型说明
deps.setTimeouttypeof setTimeout设置定时器
deps.clearTimeouttypeof clearTimeout清除定时器
deps.requestAnimationFrameWindow['requestAnimationFrame']请求动画帧(可选)
deps.requestIdleCallbackWindow['requestIdleCallback']请求空闲回调(可选)

环境要求

  • 浏览器环境: 使用定时器 API 和帧调度 API
  • Node.js 环境: 至少需要 setTimeout 和 clearTimeout

函数签名

typescript
function createInterruptibleTask<T>(
  task: (iteration: number) => T | void,
  totalIterations: number,
  options?: InterruptibleTaskOptions,
  deps?: InterruptibleTaskDeps
): InterruptibleTask<T>

type TaskStatus = 'idle' | 'running' | 'paused' | 'completed' | 'cancelled'
type TaskPriority = 'high' | 'normal' | 'low'

interface InterruptibleTaskOptions {
  chunkSize?: number           // 每个时间片执行的迭代次数,默认 1000
  maxChunkTime?: number        // 每个时间片的最大执行时间(毫秒),默认 16
  priority?: TaskPriority      // 优先级,默认 'normal'
  onProgress?: (progress: TaskProgress) => void
  onComplete?: () => void
  onCancel?: () => void
}

interface TaskProgress {
  current: number      // 当前已完成的迭代次数
  total: number        // 总迭代次数
  percentage: number   // 完成百分比 (0-100)
}

interface InterruptibleTask<T> {
  start: () => Promise<T[]>
  pause: () => void
  resume: () => void
  cancel: () => void
  getStatus: () => TaskStatus
  getProgress: () => TaskProgress
}

参数

参数名类型必填默认值说明
task(iteration: number) => T | void-任务函数,接收当前迭代索引
totalIterationsnumber-总迭代次数
options.chunkSizenumber1000每个时间片执行的迭代次数
options.maxChunkTimenumber16每个时间片的最大执行时间(毫秒)
options.priorityTaskPriority'normal'任务优先级
options.onProgressfunction-进度回调函数
options.onCompletefunction-完成回调函数
options.onCancelfunction-取消回调函数
depsInterruptibleTaskDeps-依赖注入对象

返回值

类型说明
InterruptibleTask<T>可中断任务控制对象,包含 start/pause/resume/cancel 等方法

工作原理

  1. 任务分片

    • 将总迭代次数分成多个时间片(chunk)
    • 每个时间片执行 chunkSize 次迭代或最多执行 maxChunkTime 毫秒
  2. 调度策略(根据 priority):

    • high: 使用 requestAnimationFrame,下一帧立即执行
    • normal: 使用 setTimeout(0),加入宏任务队列
    • low: 使用 requestIdleCallback,空闲时执行
  3. 执行流程

    • start(): 开始执行任务
    • 每个时间片执行完后,让出主线程控制权
    • 检查任务状态(paused/cancelled)
    • 继续下一个时间片,直到完成所有迭代
  4. 状态管理

    • idle: 初始状态
    • running: 执行中
    • paused: 已暂停,可恢复
    • completed: 已完成
    • cancelled: 已取消
  5. 中断控制

    • pause(): 暂停执行,保留进度
    • resume(): 从暂停点继续
    • cancel(): 取消任务,清理资源
  6. 进度跟踪

    • 每个时间片执行后更新进度
    • 调用 onProgress 回调
    • 提供 getProgress() 查询当前进度

适用于大数据处理、复杂计算等耗时操作,避免阻塞主线程导致页面卡顿。