--- title: await slug: Web/JavaScript/Reference/Operators/await tags: - Function - JavaScript - Language feature - Operator - Primary Expression translation_of: Web/JavaScript/Reference/Operators/await ---
await
演算子は、{{jsxref("Statements/async_function", "async function")}} によって {{jsxref("Promise")}} が返されるのを待機するために使用します。
[rv] = await expression;
expression
rv
解決された promise の値。expression が Promise
ではない場合はその値自体を返す。
await
式は async
function の実行を一時停止し、Promise
の解決または拒否を待ちます。解決した後に async
function の実行を再開します。再開するときに await
式は解決された Promise
にラップされた値を返します。
Promise
が拒否された場合、await
式は理由となった値を投げます。
await
式に続く値が Promise
ではなかった場合、解決された Promise に変換されます。
await
は実行フローを分割できるため、await
の関数の呼び出し元は、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); console.log(x); // 10 } f1();
{{jsxref("Global_Objects/Promise/then", "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
が拒否された場合、拒否された値が投げられます。
async function f4() { try { var z = await Promise.reject(30); } catch(e) { console.error(e); // 30 } } f4();
拒否された Promise
は try
文を使用せずにエラーハンドリングを行えます。
var response = await promisedFunction().catch((err) => { console.error(err); }); // response will be undefined if the promise is rejected
仕様書 |
---|
{{SpecName("ESDraft", "#sec-async-function-definitions", "async functions")}} |
{{Compat("javascript.operators.await")}}