本文へスキップ
BecomeCoder

JavaScriptコース · 第6章 オブジェクト指向と非同期 ― 仕上げ · レッスン25

Promise と async/await ― 非同期の基本

ブラウザで完結

導入

Webでは「あとから結果が来る」処理(通信・タイマーなど)が普通です。JavaScript では Promiseasync/await で、こうした非同期処理を扱います。

説明

Promise は「いずれ完了する処理」の約束です。then で成功時、catch で失敗時の続きを書けます。

function wait(ms) {
  return new Promise((resolve) => {
    // 学習用: 実際の待ち時間は短くする(即 resolve)
    resolve(`待ったよ (${ms}ms のつもり)`);
  });
}

wait(100).then((msg) => {
  console.log(msg);
});

async 関数の中では await で Promise の結果を「待ってから」次へ進められます。見た目は同期コードに近づきます。

async function main() {
  const msg = await wait(50);
  console.log("結果:", msg);
  console.log("完了");
}

main();

失敗は try / catch で受け止められます。

function fail() {
  return Promise.reject(new Error("失敗した"));
}

async function demo() {
  try {
    await fail();
  } catch (err) {
    console.log("捕捉:", err.message);
  }
}
demo();

この実行環境async 関数や top-level の await に対応しています。通信(fetch)はネットワークや CORS の都合で動かない場合があるため、まずは Promise の形に慣れましょう。

やってみよう

wait を複数回 await して順番にログを出したり、catch でエラーを捕捉したりしてみましょう。

演習

async 関数 run を定義し、中で await wait(10) の結果を表示してから呼び出してください。

ヒント1を見る

async function run() { console.log(await wait(10)); } run();

実際に動かしてみよう

下のエディタにJavaScriptを書いて「実行」を押すと、ブラウザ内のJavaScriptで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(console.log の結果が下に出ます。input() を使う回は「標準入力」欄に値を入れてから実行します)。

JavaScript — ブラウザ内で実行

ブラウザ本体のJavaScriptで実行する学習用環境を読み込みます(外部エンジン不要・軽量です)。
スクロールして表示された時点でも自動で読み込まれます。