01 · TypeScript 并发任务池
待实测模型输出与实测结果:暂无,尚未运行模型。下方检查为本站编写的测试夹具,不是模型输出。
提交给模型的提示词
实现 pool.ts,导出 async function pool<T>(tasks: Array<() => Promise<T>>, limit: number): Promise<PromiseSettledResult<T>[]>。任务惰性启动,同时最多运行 limit 个,结果保持输入顺序;promise 拒绝和同步抛错均转为 rejected 结果,不阻止其他任务。空输入返回 [];非正整数 limit 必须抛 RangeError,即使输入为空。无需依赖。只返回 pool.ts,不修改给定检查。输入/起始文件
// Input: delays [30, 5, 15] ms; limit 2.
// Implementation file: pool.ts测试前保存以下检查
// Save as pool.check.ts (Node 22+)
import assert from 'node:assert/strict';
import { pool } from './pool.ts';
let active = 0, peak = 0;
const tasks = [30, 5, 15].map((ms, i) => async () => {
active++; peak = Math.max(peak, active);
await new Promise(r => setTimeout(r, ms));
active--; return i;
});
assert.deepEqual(await pool(tasks, 2), [0,1,2].map(value => ({status:'fulfilled', value})));
assert.equal(peak, 2);
const rejected = await pool([() => { throw new Error('sync'); }, () => Promise.reject('async'), async () => 7], 1);
assert.deepEqual(rejected.map(r => r.status), ['rejected','rejected','fulfilled']);
assert.deepEqual(rejected[2], {status:'fulfilled', value:7});
assert.deepEqual(await pool([], 2), []);
for (const limit of [0, -1, 1.5, NaN, Infinity]) {
await assert.rejects(async () => pool([], limit), RangeError);
}
console.log('pool: all assertions passed');本地执行命令
npx --yes --package tsx@4.21.0 tsx pool.check.ts预期行为/验收条件
结果保持 [0, 1, 2],峰值并发数为 2,拒绝不影响后续任务。空输入和非法 limit 通过断言。预期末行:pool: all assertions passed。挂起超过 30 秒时停止运行并记录超时。