01 · TypeScript 同時実行プール
モデルテスト待ちモデルの出力と観察された結果: 利用できません。モデルの実行は実行されていません。これらのチェックは作成されたフィクスチャであり、モデルの出力ではありません。
モデルを指定するように求めるプロンプト
非同期関数 pool<T>(タスク: Array<() => Promise<T>>、制限: 数値): Promise<PromiseSettledResult<T>[]> をエクスポートする pool.ts を実装します。他のタスクを停止することなく、タスクを遅延開始し、同時に最大制限内で実行し、入力順序を維持し、Promise の拒否と同期スローを解決します。空の入力は [] を返します。空の入力であっても、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 に等しく、拒否されても後のタスクは停止しません。空の入力と無効な制限が合格します。予想される最終行: pool: すべてのアサーションが渡されました。ハングした実行を 30 秒後に停止し、タイムアウトを記録します。