JavaScript

await演算子

 編集:2022.08.07 by T.A.

プロミス(Promise)を待つために使用します。

通常の JavaScript コードで、async function の内部でのみ使用することができます。よって Promise が返されるのを待機するために使用します。

¶[rv] = await expression
¶こちらが正解だと思う:
[rv =] await expression
rv プロミスの履行された値、または Promise ではない場合はその値自体を返します。
expression 待つ Promise もしくは何らかの値。

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

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

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

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

プロミスの履行を待つ

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

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

async function f1() {
  var x = await resolveAfter2Seconds(10);
  alert(x); // 10
}

D=f1(); //=[object Promise]
Thenable オブジェクト

は同様に履行されます。

async function f2() {
  const thenable = {
    then: function(resolve, _reject) {
      resolve('resolved!')
    }
  };
  alert(await thenable); //表示:resolved!
}

D=f2(); //=[object Promise]
プロミスへの変換

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

async function f3() {
  var y = await 20;
  alert(y); //表示:20
}

D=f3(); //=[object Promise]
Promise の拒否

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

async function f4() {
  try {
    var z = await Promise.reject(30);
  } catch(e) {
    alert(e); //表示:30
  }
}
D=f4(); //=[object Promise]
拒否された Promise の処理

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

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

¶省く


テスト