Concurrency
Promise.all: 一つが失敗しても他の処理を自動では中止しない
Promise.all は最初の rejection で結果を失敗にしますが、開始済みの非同期処理をキャンセルしません。
SourcepromiseAllCancellation.ts
Node.js 22
export function runTogether(tasks: readonly Promise<unknown>[]): Promise<unknown[]> {
return Promise.all(tasks);
}TestpromiseAllCancellation.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { runTogether } from "../../src/async/promiseAllCancellation.js";
test("PromiseAllの失敗後も開始済み処理は完了する", async () => {
let completed = false;
const slow = Promise.resolve().then(() => { completed = true; return "done"; });
const failed = Promise.reject(new Error("stop"));
await assert.rejects(runTogether([slow, failed]));
await slow;
assert.equal(completed, true);
});01Assertion
このテストで確認できること
- 一つの Promise が失敗すると Promise.all は reject する
- 別の開始済み Promise は完了する
全ての作業を止める必要がある場合は、AbortSignal などの協調的キャンセルを各処理へ設計します。
OBSERVED RESULT
expected: Promise.all → rejection
actual: rejection
expected: started task → completed