performChunk()
function performChunk<T>(array, consumer): PerformChunkHandle;
Defined in: packages/utils/src/@browser/perform-chunk.ts:58
分片执行任务 只能在浏览器环境中执行 把一个大任务分片执行,每次执行一小部分任务,然后让出主线程,等待下一次执行
Type Parameters
| Type Parameter | Description |
|---|---|
T | 数组元素类型 |
Parameters
| Parameter | Type | Description |
|---|---|---|
array | T[] | 要执行的数据组 |
consumer | (data, index) => void | 消费者函数 |
Returns
取消句柄与完成 Promise
Example
performChunk([1, 2, 3, 4, 5], (item, index) => {
console.log(`Processing item ${item} at index ${index}`);
});
Remarks
UTL-003 修复了三件事:
- 零预算空转:原循环条件是
idle.timeRemaining() > 0 && i < array.length, 全文没有读过didTimeout。浏览器在{ timeout: 100 }到期时会以didTimeout: true+timeRemaining() === 0回调 —— 那正是「主线程一直很忙、 必须强制推进」的信号,而原实现在这一帧一项都不消费就重排下一帧。 主线程持续繁忙时它会一直空转(实测:4 帧调度、0 项消费)。 文件顶部的注释还写着「显式 timeout 保证最坏情况下的响应上限」—— 实现与自己的注释相反。改成 do-while:每帧至少消费一项。 - 错误无通道:
consumer抛出的错误会直接逃逸到 idle callback, 变成一条无人接管的全局错误,且剩余分片仍会继续排。现在错误进done,并停止调度。 - 无法取消:长任务一旦启动就跑到底。现在返回
cancel()。
返回值是新增的,原有 performChunk(...) 的调用点无需改动。