web-dev-qa-db-ja.com

非同期関数の外側で待機してもコンソールにエラーがスローされない

MDNは言う

awaitキーワードはasync関数内でのみ有効であることを忘れないでください。 async関数の本体の外部で使用すると、SyntaxErrorを取得します。

しかし、それは真実ではありません。

DevToolsコンソールで次のコードを試してください。エラーは発生せず、結果は次のとおりです。

async function a(val) { return val; }
await a(10) // await is not inside async function
10

コードまたはドキュメントの何が問題になっていますか?

13
Green

MDNドキュメントは正しいものであり、JavaScriptでどのように機能するかを説明しています。

これは、非同期/待機コードのテストを容易にするために、DevToolsによって追加された機能です。そして、それはJavaScriptの機能ではありません。

2017年8月11日以降、DevToolsでサポートされているようです:

https://chromium.googlesource.com/chromium/src.git/+/e8111c396fef38da6654093433b4be93bed01dce

あなたがスパイした場合

ConsoleModel.js

129行目に、非同期としてマークされた式を評価する機能があります。

async evaluateCommandInConsole
9
quirimmo

何も間違っていません。

DevToolsコンソールの特別な機能 !が見つかりました。 できるだけ簡単にするため ライブ環境でasync-_awaitコードを試すことができます。コンソールに入力したコードは、async関数で自動的にラップされると想像できます。実際、別の答えが指摘したように、これはまさに起こることです。

これはコンソールで機能しますが、JavaScriptの機能ではないことに注意することが重要です。

だから、あなたの観察はすべて正しいと期待されています! await関数の外部でasyncを使用するページにスクリプトをロードしようとするとエラーになるため、MDNドキュメントは正確です。一方、DevToolsコンソールはこの作業を行うように設計されているため(開発者の人間工学的目的のみ)、コンソールでエラーが発生することなくコードが実行されます。

これだけではありません DevToolsコンソールのスリーブをトリックする 。一般的に、reallyページでコードの実行方法をテストする場合は、コンソールではなくページで実際にスクリプトを実行するのが最善です。

8
Caleb Miller