await

await 演算子はプロミス (Promise) を待つために使用します。通常の JavaScript コードで、 async function の内部でのみ使用することができます。によって Promise が返されるのを待機するために使用します。

構文

[rv] = await expression
expression

待つ Promise もしくは何らかの値。

rv

プロミスの履行された値、または Promise ではない場合はその値自体を返します。

解説

await 式は async 関数の実行を一時停止し、 Promise が決定される(すなわち履行または拒否される)まで待ち、履行された後に async 関数の実行を再開します。最下位時に、 await 式の値は履行された Promise の値になります。

Promise が拒否された場合、await 式は拒否された値で例外を発生させます。

await 演算子に続くの値が Promise ではなかった場合、解決された Promise に変換されます。

await は実行フローを分割するため、非同期関数の呼び出し元が実行を再開することができます。 await がその非同期関数の継続を延期した後は、後続の文が実行されます。この await がその関数で実行される最後の式である場合、実行は継続され、 await の関数の完了を保留していた Promise を呼び出し元に返し、その呼び出し元での実行を再開します。

プロミスの履行を待つ

Promiseawait 式に渡された場合、 Promise が履行されて履行値を返すのを待ちます。

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function f1() {
  var x = await resolveAfter2Seconds(10);
  console.log(x); // 10
}

f1();

Thenable オブジェクト

Thenable オブジェクトは同様に履行されます。

async function f2() {
  const thenable = {
    then: function(resolve, _reject) {
      resolve('resolved!')
    }
  };
  console.log(await thenable); // resolved!
}

f2();

プロミスへの変換

値が Promise でない場合は、値を解決済みの Promise に変換して待ちます。

async function f3() {
  var y = await 20;
  console.log(y); // 20
}

f3();

Promise の拒否

Promise が拒否された場合、拒否された値で例外が発生します。

async function f4() {
  try {
    var z = await Promise.reject(30);
  } catch(e) {
    console.error(e); // 30
  }
}

f4();

拒否された Promise の処理

拒否された Promisetry ブロックなしで処理することができます。

var response = await promisedFunction().catch((err) => { console.error(err); });
// プロミスが拒否された場合、応答は undefined になります

最上位の await

await キーワードは、 JavaScript モジュール内では単独で(非同期関数の外で)使用することができます。つまり、 await を使う子モジュールを持つモジュールは、子モジュールが実行されるのを待ってから、自分自身が実行されるようになります。他の子モジュールの読み込みをブロックすることなく、実行することができます。

以下は、 Fetch API を使用し、 exportの中で await を指定したシンプルなモジュールの例です。これを含むすべてのモジュールは、コードを実行する前に読み取りが解決するのを待ちます。

// fetch request
const colors = fetch('../data/colors.json')
  .then(response => response.json());

export default await colors;

仕様書

Specification
ECMAScript Language Specification
# sec-async-function-definitions

ブラウザーの互換性

BCD tables only load in the browser

関連情報