並行処理パターン(all/settled/race)の型
Promise.all / allSettled / raceで並行処理をモデル化し、それぞれの結果の型を理解して安全なヘルパーを作ります
「並行処理パターン(all/settled/race)の型」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。
はじめに
目標: Promise.allでタスクを並行実行し、allSettledで成功と失敗が混在する結果を処理し、タイムアウトやフォールバックにはraceを使います。それぞれが返す型を学びます。
all:タプル型
Promise.allにタプルを渡すと、要素の型と順序が保持されます。各要素は内部の型までawaitされます。
async function one(): Promise<number> { return 1 }
async function two(): Promise<string> { return "two" }
async function runAll() {
const [a, b] = await Promise.all([one(), two()]);
// a: number, b: string
console.log(a + 1, b.toUpperCase());
}
runAll();all:並行マッピング
複数のタスクをまず開始し、その後まとめてawaitします。ここではPromise.allがstring[]を返します。
async function fetchItem(id: number): Promise<string> {
return `item-${id}`;
}
async function getMany(ids: number[]): Promise<string[]> {
const tasks = ids.map(id => fetchItem(id)); // start all
return Promise.all(tasks); // await all
}
getMany([1,2,3]).then(xs => console.log(xs));allSettledの型付け
allSettledは決してrejectせず、fulfilledまたはrejectedの結果オブジェクトの配列に解決されます。statusで型を絞り込めます。
async function mightFail(n: number): Promise<number> {
if (n % 2 === 0) return n; else throw new Error("odd")
}
async function runSettled() {
const results = await Promise.allSettled([mightFail(1), mightFail(2)]);
for (const r of results) {
if (r.status === "fulfilled") {
// r: PromiseFulfilledResult<number>
console.log("ok", r.value);
} else {
// r: PromiseRejectedResult
console.warn("fail", r.reason);
}
}
}
runSettled();raceとタイムアウト
raceは、最初に確定したPromiseの結果で解決または拒否されます。タイムアウトと組み合わせて、待ち時間の上限を設定します。
function timeout<T>(ms: number, msg = "Timeout"): Promise<T> {
return new Promise((_, reject) => setTimeout(() => reject(new Error(msg)), ms));
}
async function slow(): Promise<string> { return new Promise(res => setTimeout(() => res("done"), 100)); }
async function withTimeout() {
const result = await Promise.race<Promise<string>>([
slow(),
timeout<string>(50, "Too slow"),
]);
console.log(result);
}
withTimeout().catch(e => console.error("raced:", e.message));ヒントと使い分け
ヒント:
- all: 結果を集める際に、1つの失敗ですぐに終了します。
- allSettled: 例外をスローせず、成功とエラーを収集します。
- race: タイムアウトやフォールバックに使います。要素の型を明示してください。
Promise.allの型付けの確認
簡単な確認: Promise.allの型付けについて正しい説明はどれでしょうか?
まとめ
まとめ: 型付きの並行処理にはallを、すべての結果を調べるにはallSettledを、タイムアウトにはraceを使います。それぞれのAPIが返す形を把握しておきましょう。
よくある質問
「並行処理パターン(all/settled/race)の型」レッスンは無料ですか?
はい。「並行処理パターン(all/settled/race)の型」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。
「並行処理パターン(all/settled/race)の型」で何を学びますか?
Promise.all / allSettled / raceで並行処理をモデル化し、それぞれの結果の型を理解して安全なヘルパーを作ります ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「並行処理パターン(all/settled/race)の型」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Promise とasync/awaitの型付け
- エラーの型付け(unknown)、catchでの絞り込み
- 並行処理パターン(all/settled/race)の型