概要async/await と Promise の基本的な違いは、await fn() は現在の関数の実行を一時停止しますが、promise.then(fn) は fn 呼び出しをコールバック チェーンに追加した後、現在の関数の実行を継続することです。 const fn = () => console.log('hello') 定数a = 非同期() => { await fn() // fn の実行を一時停止する } // a が呼び出されると、fn の実行が再開されます a() // "hello" const promise = Promise.resolve() // コールバックチェーンにfnを追加した後、fnの実行を継続します promise.then(fn) // "こんにちは" スタック トレースのコンテキストでは、この違いは非常に重要です。 Promise チェーン (desugared かどうかに関係なく) がいつでも未処理の例外をスローすると、JavaScript エンジンはエラー メッセージを表示し、(うまくいけば) 有用なスタック トレースをログに記録します。 開発者としては、通常の Promise を使用する場合でも、async await を使用する場合でも、これを期待するでしょう。 約束非同期関数 b の呼び出しが解決されると、関数 c が呼び出されるシナリオを想像してください。 const b = () => Promise.resolve() 定数a = () => { b().then(() => c()) } が呼び出されると、次のことが同期的に発生します。
その後、関数 a の本体のコード実行を終了します。 A は決して中断されず、B への非同期呼び出しが解決されるまでにコンテキストは消えてしまいます。 b (または c) が非同期に例外をスローした場合に何が起こるか想像してみてください。理想的には、B (または C) がそこから呼び出されたので、スタック トレースに A が含まれるはずですよね?を参照しなくなったので、これをどのように実行できるでしょうか? これを機能させるには、JavaScript エンジンが上記の手順を超えて何かを実行する必要があります。つまり、機会があるたびにスタック トレースをキャプチャして保存する必要があります。 V8 では、スタック トレースは b によって返される Promise に添付されます。 Promise が満たされると、スタック トレースが渡され、c が必要に応じて使用できるようになります。 b()[a] -> b().then()[a] -> c[a?:a] スタック トレースのキャプチャには時間がかかります (つまり、パフォーマンスが低下します)。これらのスタック トレースを保存するにはメモリが必要です。 非同期/待機以下は、Promise の代わりに async/await を使用して記述した同じプログラムです。 const b = () => Promise.resolve() 定数a = 非同期() => { b() を待つ c() } await を使用すると、スタック トレースが await 呼び出しで収集されない場合でも、呼び出しチェーンを再開できます。 これは、A が中断され、B が解決されるのを待機しているために可能です。 b が例外をスローした場合、スタック トレースは要求に応じてこの方法で再構築できます。 c が例外をスローした場合、その時点ではまだ a のコンテキスト内にあるため、同期関数の場合と同じようにスタック トレースを構築できます。 次の推奨事項に従って、JavaScript エンジンがスタック トレースをより効率的に処理できるようにします。
以上がJS非同期スタックトレースの詳細と、なぜawaitがPromiseより優れているのかです。Javascriptの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。 以下もご興味があるかもしれません:
|
<<: WindowsとLinux間でファイルを転送する方法
>>: Windows での MySQL のダウンロード、インストール、設定、使用に関するチュートリアル
Ubuntuの最新バージョンでは、ユーザーは中国語入力方法を別途ダウンロードする必要がなくなりました...
目次1. プロトタイプとは何ですか? 1.1 関数プロトタイプオブジェクト1.2 コンストラクタを使...
nginx をインストールApple Mac ではインストールに brew を使用します。brew ...
問題の説明:最近、rsyncで毎回同期するデータ量が多いが、データベースのbakファイルを保持する必...
この記事の例では、検証コードを作成して取得するためのjsキャンバスの具体的なコードを共有しています。...
目次序文最適化派生的な質問: beforeDestroy はトリガーされませんか?序文タイマーをクリ...
Dockerfile は、命令を含むテキスト ファイルです。各命令はレイヤーを構築するため、各命令の...
カスケードを制御するために CSS の任意のプロパティに割り当てることができる特別な値が 2 つあり...
序文js を使用して、年の回転選択効果を実現します。では早速、写真を見てみましょう。 1. アイデア...
目次1. はじめに2. コードの実装2.1 目的分析2.2 実装プロセス2.2.1 エントリーコード...
目次背景質問1エラー 2エラー 3エラー4要約する背景テスト環境では、docker プラグインを統合...
500 (内部サーバー エラー) サーバーでエラーが発生したため、要求を完了できませんでした。 50...
MySQL 起動エラーWindows 10 に MySQL をインストールする前は、net star...
Sysbench は、MySQL データベース ストレージ エンジン InnoDB のディスク I/...
ケース1: 最後の提出とプッシュなし次のコマンドを実行します。 git コミット --amend g...