createInterruptibleTask
创建可中断的异步任务,支持暂停、恢复、取消和进度跟踪。
前置依赖
依赖参数
| 参数名 | 类型 | 说明 |
|---|---|---|
deps.setTimeout | typeof setTimeout | 设置定时器 |
deps.clearTimeout | typeof clearTimeout | 清除定时器 |
deps.requestAnimationFrame | Window['requestAnimationFrame'] | 请求动画帧(可选) |
deps.requestIdleCallback | Window['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 | 是 | - | 任务函数,接收当前迭代索引 |
totalIterations | number | 是 | - | 总迭代次数 |
options.chunkSize | number | 否 | 1000 | 每个时间片执行的迭代次数 |
options.maxChunkTime | number | 否 | 16 | 每个时间片的最大执行时间(毫秒) |
options.priority | TaskPriority | 否 | 'normal' | 任务优先级 |
options.onProgress | function | 否 | - | 进度回调函数 |
options.onComplete | function | 否 | - | 完成回调函数 |
options.onCancel | function | 否 | - | 取消回调函数 |
deps | InterruptibleTaskDeps | 否 | - | 依赖注入对象 |
返回值
| 类型 | 说明 |
|---|---|
InterruptibleTask<T> | 可中断任务控制对象,包含 start/pause/resume/cancel 等方法 |
工作原理
任务分片:
- 将总迭代次数分成多个时间片(chunk)
- 每个时间片执行
chunkSize次迭代或最多执行maxChunkTime毫秒
调度策略(根据 priority):
high: 使用requestAnimationFrame,下一帧立即执行normal: 使用setTimeout(0),加入宏任务队列low: 使用requestIdleCallback,空闲时执行
执行流程:
start(): 开始执行任务- 每个时间片执行完后,让出主线程控制权
- 检查任务状态(paused/cancelled)
- 继续下一个时间片,直到完成所有迭代
状态管理:
idle: 初始状态running: 执行中paused: 已暂停,可恢复completed: 已完成cancelled: 已取消
中断控制:
pause(): 暂停执行,保留进度resume(): 从暂停点继续cancel(): 取消任务,清理资源
进度跟踪:
- 每个时间片执行后更新进度
- 调用
onProgress回调 - 提供
getProgress()查询当前进度
适用于大数据处理、复杂计算等耗时操作,避免阻塞主线程导致页面卡顿。