JavaScript は、Web 開発に広く使用されている強力なシングルスレッド プログラミング言語です。 JavaScript における一般的な課題は、メインスレッドをブロックせずに、API からのデータの取得や時間に敏感な操作の実行などの非同期タスクを処理することです。開発者は時間の経過とともに、コールバックの使用から Promise に移行し、現在はより洗練された async/await 構文を使用して非同期操作を管理するようになりました。このガイドでは、基本から始めて高度なシナリオに至るまで、これらの概念を段階的に説明します。最終的には、実際のアプリケーションで非同期 JavaScript を自信を持って使用できるようになります。
JavaScript では、サーバーからのデータの取得、ファイルの読み取り、タイムアウトの設定などのタスクが完了するまでに時間がかかることがあります。これらのタスクが終了するのを待つ代わりに (プログラムの残りの部分の実行がブロックされてしまいます)、JavaScript ではそのようなタスクを非同期で実行できます。これは、メイン プログラム フローから独立して処理され、他のコードを遅延なく実行できることを意味します。
コールバックは、別の関数に引数として渡される関数です。最初の関数が操作を完了すると、コールバック関数を実行して完了を通知します。
function fetchData(callback) { setTimeout(() => { console.log("Data fetched!"); callback(); }, 2000); // Simulates a 2-second delay } function processData() { console.log("Processing data..."); } fetchData(processData);
説明:
ネストされたコールバックを使用して複数の非同期タスクを処理すると、すぐにコードが読めなくなり、保守が困難になる可能性があります。
setTimeout(() => { console.log("Step 1: Data fetched"); setTimeout(() => { console.log("Step 2: Data processed"); setTimeout(() => { console.log("Step 3: Data saved"); }, 1000); }, 1000); }, 1000);
この「破滅のピラミッド」により、コードのデバッグと保守が困難になります。
promise は、現在、将来、または決して利用できない値を表すオブジェクトです。 Promise には 3 つの状態があります:
function fetchData(callback) { setTimeout(() => { console.log("Data fetched!"); callback(); }, 2000); // Simulates a 2-second delay } function processData() { console.log("Processing data..."); } fetchData(processData);
async/await は ES2017 で導入された、Promise よりも糖衣構文です。非同期コードが同期しているように見えるため、可読性と保守性が向上します。
setTimeout(() => { console.log("Step 1: Data fetched"); setTimeout(() => { console.log("Step 2: Data processed"); setTimeout(() => { console.log("Step 3: Data saved"); }, 1000); }, 1000); }, 1000);
複数の独立した非同期タスクを並行して実行する必要がある場合:
function fetchData() { return new Promise((resolve, reject) => { setTimeout(() => { console.log("Data fetched!"); resolve("Fetched data"); }, 1000); }); } function processData(data) { return new Promise((resolve, reject) => { setTimeout(() => { console.log(`Processing: ${data}`); resolve("Processed data"); }, 1000); }); } function saveData(data) { return new Promise((resolve, reject) => { setTimeout(() => { console.log(`Saving: ${data}`); resolve("Data saved"); }, 1000); }); } // Chaining Promises fetchData() .then((data) => processData(data)) .then((processedData) => saveData(processedData)) .then((finalResult) => console.log(finalResult)) .catch((error) => console.error("Error:", error));
非同期関数の try...catch を使用してエラーを適切に管理します:
async function handleData() { try { const fetchedData = await fetchData(); const processedData = await processData(fetchedData); const savedData = await saveData(processedData); console.log(savedData); } catch (error) { console.error("Error:", error); } } handleData();
関数は解決された値の代わりに Promise を返します。これにより、予期しない動作が発生する可能性があります。
async function fetchAllData() { const task1 = fetchData(); const task2 = fetchData(); const results = await Promise.all([task1, task2]); console.log("All data fetched:", results); } fetchAllData();
いいえ、await は Promise に対してのみ機能します。ただし、fetch や Node.js の fs.promises API などのライブラリは、ネイティブの Promise ベースのメソッドを提供します。
コールバックは、小規模で単純なタスクや、Promise をサポートしていない古い API を操作する場合には依然として役立ちます。
非同期 JavaScript をマスターすることは、最新の Web アプリケーションを扱う開発者にとって不可欠です。コールバックから始めると、Promise と async/await がどのように非同期コードを簡素化し、読みやすさを向上させるかを理解することができます。コールバックは控えめに使用し、エラー処理を改善するために Promise を活用し、クリーンで直感的なコードを実現するために async/await を採用します。これらのツールを使用すれば、プロジェクト内のあらゆる非同期の課題に取り組む準備が整います。
以上が非同期 JavaScript をマスターする: コールバック、Promise、および Async/Await の簡略化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。