0Pricing
TypeScript Academy · レッスン

並行処理パターン(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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Promise とasync/awaitの型付け
  2. エラーの型付け(unknown)、catchでの絞り込み
  3. 並行処理パターン(all/settled/race)の型
← TypeScript Academyに戻る