跳到主要内容

performChunk()

function performChunk<T>(array, consumer): PerformChunkHandle;

Defined in: packages/utils/src/@browser/perform-chunk.ts:58

分片执行任务 只能在浏览器环境中执行 把一个大任务分片执行,每次执行一小部分任务,然后让出主线程,等待下一次执行

Type Parameters​

Type ParameterDescription
T数组元素类型

Parameters​

ParameterTypeDescription
arrayT[]要执行的数据组
consumer(data, index) => void消费者函数

Returns​

PerformChunkHandle

取消句柄与完成 Promise

Example​

performChunk([1, 2, 3, 4, 5], (item, index) => {
console.log(`Processing item ${item} at index ${index}`);
});

Remarks​

UTL-003 修复了三件事:

  1. 零预算空转:原循环条件是 idle.timeRemaining() > 0 && i < array.length, 全文没有读过 didTimeout。浏览器在 { timeout: 100 } 到期时会以 didTimeout: true + timeRemaining() === 0 回调 —— 那正是「主线程一直很忙、 必须强制推进」的信号,而原实现在这一帧一项都不消费就重排下一帧。 主线程持续繁忙时它会一直空转(实测:4 帧调度、0 项消费)。 文件顶部的注释还写着「显式 timeout 保证最坏情况下的响应上限」—— 实现与自己的注释相反。改成 do-while:每帧至少消费一项。
  2. 错误无通道:consumer 抛出的错误会直接逃逸到 idle callback, 变成一条无人接管的全局错误,且剩余分片仍会继续排。现在错误进 done,并停止调度。
  3. 无法取消:长任务一旦启动就跑到底。现在返回 cancel()。

返回值是新增的,原有 performChunk(...) 的调用点无需改动。