ホームページ  >  記事  >  ウェブフロントエンド  >  ChatGPT は [js-async/await] の学習に役立ちます

ChatGPT は [js-async/await] の学習に役立ちます

藏色散人
藏色散人転載
2023-04-14 14:47:201066ブラウズ

この質問には、使用方法について尋ね、疑問を呈し、習熟度を確認することが含まれています~

質問

js sync await 教えてください、私はまだ少し混乱しています

JavaScript では、サーバーからのデータの取得、サーバーへのデータの送信など、非同期タスクを処理する必要があることがよくあります。従来の方法では、コールバック関数を使用して非同期タスクを処理しますが、複数のレベルでネストするとコールバック地獄が発生し、コードの保守とデバッグが困難になります。この問題を解決するために、JavaScript では非同期タスクを処理するために Promise と async/await が導入されました。

その中で、async/await は ES8 の新しい構文糖衣であり、非同期タスクをより簡単かつ直感的に処理できます。 async/await については、次の点から理解できます:

  1. async 関数は Promise オブジェクトを返す非同期関数であり、await キーワードを使用して結果を待つことができます。待機中またはプロセス中に、非同期関数は CPU を解放して、他のタスクを実行できるようにします。

  2. await キーワードは、非同期関数でのみ使用できます。Promise オブジェクトの結果を待つことができます。Promise オブジェクトが解決されると、await 式の値が返される結果になりますby Promise. ; Promise オブジェクトが拒否された場合、エラーがスローされ、try-catch ブロックによってキャッチされます。

  3. 非同期関数内には複数の await 式を含めることができ、それらは順番に実行されます。後続の await 式は、前の await 式が完了するまで待ってから実行する必要があります。

  4. async/await を使用すると、同期コードと同様の形式で非同期コードを作成でき、コードがより読みやすく理解しやすくなり、デバッグと保守が容易になります。

次に、async/await を使用して非同期タスクを処理する例を示します。

async function getData() {
  try {
    const result1 = await fetch('/api/data1'); // 等待获取数据1
    const result2 = await fetch('/api/data2'); // 等待获取数据2
    return [result1, result2]; // 返回获取的数据
  } catch (error) {
    console.error(error); // 捕获错误并输出到控制台
  }
}

getData().then(data => {
  console.log(data); // 输出获取的数据
});

上の例では、getData 関数は async キーワードを使用して宣言されており、関数 await キーワードを使用して、非同期操作の結果を待ちます。ここでは、2 つの await 式を使用して、異なるデータを取得します。この例では、最終的に 2 つの非同期操作の結果配列が返されますが、例外が発生した場合は try-catch ブロックでキャッチされ、エラー情報が出力されます。最後に、getData() メソッドを呼び出して非同期データを取得し、結果を返した後にコンソールにデータを出力します。

疑問を提起します

非常に混乱しています。await は対応する非同期関数を待つことですが、なぜ await を使用する関数に async を追加する必要があるのでしょうか?

とても良い質問です!答えは、 await キーワードは非同期関数でのみ使用できるためです。

非同期関数を使用して非同期タスクの結果を取得する場合は、それを async 関数内に配置し、await を使用して、非同期操作の結果。したがって、await キーワードを使用する場合は、関数を非同期関数として宣言する必要があります。一方、async 関数を使用していない場合、その関数内で await を使用することはできません。

言い換えると、関数が async 関数として宣言されている場合にのみ、関数に await キーワードを含めることができます。これは、async/await 構文の基本前提でもあります。関数を async として宣言すると、関数が Promise を返す可能性があることが JS エンジンに伝えられ、関数の実行時に JS エンジンが特別な処理を実行できるようになります。

await を使用して非同期タスクの結果を待機する場合、必ずしも関数内ですぐに Promise オブジェクトを返す必要はないことに注意してください。これは、await キーワードの実行プロセスが次のとおりであるためです。 Promise チェーン呼び出しに関連するもので、実行プロセスは同様で、Promise オブジェクトが自動的に作成されて返されます。

一般に、async と await は、Promise 非同期プログラミング スタイルを構成する構文糖衣であり、非同期コードをより直感的で読みやすくし、同期スタイル コードを使用して非同期オペレーション コードを作成および処理できるようにします。

理解の確認

ああ、実際には async マークは関数を変更しませんね。私は当初、このマークが関数を実行用の非同期関数に変えるものだと考えていました。

その通りです。実際、async キーワードは関数を直接非同期関数実行に変えるわけではありません。これは、関数内に非同期操作が存在する可能性があること、および await キーワードを使用するときに関数の実行を一時停止する必要がある可能性があることを JavaScript エンジンに伝えるだけです。

つまり、async キーワードは関数の性質を変更しませんが、非同期操作を処理するためのより便利な方法を提供します。 async 関数が呼び出されると、Promise オブジェクトが返され、async 関数内のコードは実行時に Promise オブジェクトのsolve メソッドに自動的にカプセル化されます。 async 関数内で await キーワードを使用して非同期操作が完了するのを待機すると、関数は非同期操作が結果を返すかエラーをスローするまで実行を一時停止します。

さらに、 return ステートメントを使用して非同期関数内で値を返す場合、戻り値は Promise.resolve() によって Promise オブジェクトにパッケージ化され、 Promise オブジェクトは return ステートメントの値です。非同期関数内で例外がスローされた場合、その例外は Promise.reject() によって Promise オブジェクトにラップされ、呼び出し元に返されます。

したがって、Promise スタイルのコードで async/await を使用して、よりシンプルで直感的な非同期プログラミング モデルを作成できます。

知識ポイントのさらなる確認

したがって、async は非同期操作の処理を表すものであり、非同期操作を作成するための構文ではありません

はい、あなたの理解は非常に正確です。 async は、非同期操作を処理するための表現であり、非同期操作を作成するための構文ではありません。

実際、JavaScript には setTimeout、XMLHttpRequest、fetch などの非同期操作を処理するためのメカニズムがすでにいくつかあります。これらのメカニズムはイベント ループの非同期プログラミング モデルに基づいており、さまざまな JavaScript アプリケーションで広く使用されています。

しかし、これらのメカニズムには、コールバック地獄やコードの可読性の低さなど、いくつかの問題があります。これらの問題を解決するために、新しい非同期プログラミング手法として Promise と async/await が導入され、急速に普及しました。

このプロセスでは、async 関数が非同期操作の処理において重要な役割を果たします。より直観的で理解しやすいコード形式を提供し、JavaScript 開発者が非同期プログラミング テクノロジをよりよく習得できるようにします。したがって、非同期関数は、より柔軟で効率的な非同期プログラミングを実現するために、Promise スタイルのコード モデルを補完するものと考えることができます。


良いお問い合わせですね~

以上がChatGPT は [js-async/await] の学習に役立ちますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。