ホームページ > ウェブフロントエンド > jsチュートリアル > コールバック、約束、およびasync/awaitを使用して、非同期JavaScriptを使用するにはどうすればよいですか?

コールバック、約束、およびasync/awaitを使用して、非同期JavaScriptを使用するにはどうすればよいですか?

Emily Anne Brown
リリース: 2025-03-12 16:34:18
オリジナル
280 人が閲覧しました

コールバック、約束、およびasync/awaitを使用して、非同期JavaScriptを使用するにはどうすればよいですか?

コールバックを使用して非同期JavaScriptを使用します

コールバックは、JavaScriptの非同期操作を処理する最も基本的な方法です。コールバックは、別の関数への引数として渡される関数であり、非同期操作が完了した後に実行されます。非同期操作がメインスレッドをブロックしないため、この「後」部分は重要です。

APIからデータを取得する簡単な例を考えてみましょう。

 <code class="javascript">function fetchData(url, callback) { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status >= 200 && xhr.status  { if (err) { console.error('Error fetching data:', err); } else { console.log('Data fetched:', data); } });</code>
ログイン後にコピー

この例では、 fetchData非同期関数です。データが取得されると(またはエラーが発生します)、 callback関数が実行されます。コールバックは、エラーオブジェクト(または成功した場合はnull )とデータ(またはエラーが発生した場合はnull )という2つの引数を受け取ります。このパターンは、機能的ですが、複数の非同期操作を扱う際に、深くネストされたコールバックで「コールバックHell」につながる可能性があります。

約束を使用して非同期JavaScriptを使用します

約束は、非同期操作を処理するためのより構造化されたクリーンな方法を提供します。約束は、非同期操作の最終的な結果を表します。これは、解決された値または拒否された理由(エラー)のいずれかです。

 <code class="javascript">function fetchDataPromise(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status >= 200 && xhr.status  console.log('Data fetched:', data)) .catch(err => console.error('Error fetching data:', err));</code>
ログイン後にコピー

ここでは、 fetchDataPromise約束を返します。 .then()メソッドは解決された値(成功)を処理し、 .catch()メソッドは拒否された理由(エラー)を処理します。約束は、非同期コードを読みやすく維持しやすくし、コールバックのネスティングの問題を回避します。

Async/awaitを使用して非同期JavaScriptを使用します

Async/awaitは、約束に基づいて構築され、非同期コードを書くためのより同期しているスタイルを提供します。 asyncキーワードは非同期関数を宣言し、 awaitキーワードは約束が解決するまで実行を一時停止します。

 <code class="javascript">async function fetchDataAsync(url) { try { const response = await fetch(url); if (!response.ok) { throw new Error(`Request failed with status ${response.status}`); } const data = await response.json(); return data; } catch (err) { console.error('Error fetching data:', err); throw err; // Re-throw the error for handling further up the call stack } } fetchDataAsync('https://api.example.com/data') .then(data => console.log('Data fetched:', data)) .catch(err => console.error('Error handling:', err));</code>
ログイン後にコピー

fetchDataAsyncは非同期関数です。先に進む前に、 fetch約束が解決するのを待っていawaittry...catchブロックは潜在的なエラーを処理します。 Async/awaitは、非同期コードを同期コードのように読み取り、読みやすさと保守性を大幅に向上させます。

JavaScriptでの非同期操作の処理において、コールバック、約束、非同期/待ち声の重要な違いは何ですか?

コールバックは最も基本的なアプローチであり、ネストされた構造のために「コールバックヘル」に苦しんでいます。約束は、 .then().catch()を使用して、より構造化された方法を提供し、読みやすさを向上させます。 Async/awaitは、約束にawaitて構築され、 asyncを使用してクリーンな同期のような構文を提供し、読みやすさと保守性をさらに向上させます。非同期操作がどのように処理されるかを根本的に変えることはありません。それは約束の上に構築された構文砂糖です。重要な違いは、基礎となるメカニズムではなく、コードの書き込み方法とその読みやすさにあります。

異なるシナリオで非同期JavaScriptコードを管理するための最良のアプローチ(コールバック、約束、または非同期/待ち望)を選択するにはどうすればよいですか?

  • コールバック:レガシーコードまたは非常にシンプルなシナリオを操作しない限り、通常は回避されます。複雑さは、複数の非同期操作ですぐにエスカレートします。
  • 約束:ほとんどの非同期操作に適した選択。特に複数のチェーン操作を扱う場合、非同期コードを処理するための構造化された管理可能な方法を提供します。
  • Async/await:ほとんどの最新のJavaScriptプロジェクトに適したアプローチ。特に複雑なシナリオでは、読みやすさを向上させ、非同期コードを理解し、維持しやすくします。しかし、それはフードの下での約束に依存しています。

非同期JavaScriptをコールバック、約束、非同期/待ち望んでいる場合、避けるべき一般的な落とし穴は何ですか?

  • コールバックHELL(コールバック):深くネストされたコールバックを避けてください。読みやすさを向上させるために、約束または非同期を使用してください。
  • 未処理の約束の拒否(Promises&Async/await):. .catch()を使用して常に潜在的なエラーを処理するか、ブロックをtry...catch 。未処理の拒絶は、静かな失敗につながる可能性があります。
  • エラー処理を無視する(3つすべて):常に堅牢なエラー処理を実装してください。非同期操作の各ステップでエラーを確認してください。
  • Async/await(Async/await)の過剰使用: Async/async/awaitは読みやすさを向上させますが、過剰使用は不必要な複雑さにつながる可能性があります。慎重に使用してください。
  • 人種条件(3つすべて):非同期操作の順序が重要な人種条件に注意してください。そのような場合には、適切な同期メカニズムが必要になる場合があります。
  • デッドロック(3つすべて):複数の非同期操作を備えた複雑なシナリオでは、2つ以上の操作がお互いを無期限に待っているブロックされているデッドロックについて注意してください。

これらのアプローチとその落とし穴を理解することにより、効率的で読みやすく、保守可能な非同期JavaScriptコードを記述できます。

以上がコールバック、約束、およびasync/awaitを使用して、非同期JavaScriptを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート