JavaScript は シングルスレッド プログラミング言語です。つまり、一度に 1 つのタスクしか実行できません。データの取得やタイマーの設定などの非同期操作ではこれが難しくなり、実行フローがブロックされ、アプリの速度が低下する可能性があります。
スレッドをフリーズさせずにこれらの非同期タスクを処理するには、非同期プログラミングを簡素化する強力なツールである Promise を使用します。 Promises を使用すると、長時間実行されるタスクをより効果的に管理し、よりクリーンで読みやすいコードを作成し、恐ろしい「コールバック地獄」
を回避できます。この記事では、Promises とは何なのか、どのように機能するのか、どのように非同期プログラミングを簡略化するのかを理解していただくことを目的としています。
レストランで食事を注文していると想像してください。注文が完了したら、料理が準備されるまでキッチンで待つ必要はありません。代わりに、キッチンがバックグラウンドで食事を準備している間、会話をしたり、雰囲気を楽しんだりできます。レストランは、準備ができたら料理を提供することを約束します。この約束は信頼できます。なぜなら、最終的には 2 つのうちの 1 つが起こるからです。食事が到着する (満たされた) か、キッチンから注文を完了できないと通知される (拒否されました) かのどちらかです。 ).
JavaScript では、Promises も同様に機能します。サーバーからデータを取得するなど、時間のかかる処理を JavaScript に依頼すると、Promise が返されます。この Promise では、すぐには結果が得られません。代わりに、「作業が完了したら連絡します。」というメッセージが表示されます。その間、コードの残りの部分は実行され続けます。タスクが完了すると、Promise は次のいずれかになります:
A Promise は、現在、将来、または決して利用できない可能性がある値を表します。 3 つの状態があります:
Promise を作成するには、Promise コンストラクターを使用します。このコンストラクターは、resolve と拒否の 2 つのパラメーターを持つ関数 (エグゼキューターと呼ばれます) を受け取ります。 Promise が満たされると、resolve 関数が呼び出されます。一方、拒否されると、reject 関数が呼び出されます。
const myPromise = new Promise((resolve, reject) => { // Simulating an asynchronous task (e.g., fetching data) const success = true; // Simulate success or failure if (success) { resolve("Operation completed successfully!"); // Fulfill the promise } else { reject("Operation failed."); // Reject the promise } });
Promise が作成されたら、resolve または拒否のいずれかを呼び出して結果を決定できます:
プロミスを作成したら、次のステップはそれを使用することです。 JavaScript には、Promises の結果を処理するためのメソッド .then()、.catch()、および .finally() がいくつか用意されています。これらのメソッドはそれぞれ特定の目的を果たし、非同期操作の結果を効果的に管理できるようにします。
const fetchData = () => { return new Promise((resolve) => { setTimeout(() => { resolve("Data fetched successfully!"); }, 1000); }); }; fetchData() .then(result => { console.log(result); // Logs: Data fetched successfully! });
const fetchWithError = () => { return new Promise((resolve, reject) => { setTimeout(() => { reject("Error fetching data."); // Simulating an error }, 1000); }); }; fetchWithError() .then(result => { console.log(result); }) .catch(error => { console.error(error); // Logs: Error fetching data. });
fetchData() .then(result => { console.log(result); // Logs: Data fetched successfully! }) .catch(error => { console.error(error); // Handle error }) .finally(() => { console.log("Promise has settled."); // Logs after either success or failure });
簡潔に言うと:
Promise の最も強力な機能の 1 つは、Promise をチェーンして複数の非同期操作を順番に実行できることです。これは、各操作が前の操作の完了を待ってから実行されることを意味します。これは、タスクが相互に依存している場合に特に便利です。
次の例を見てみましょう:
const fetchUserData = () => { return new Promise((resolve) => { setTimeout(() => { resolve({ userId: 1, username: "JohnDoe" }); }, 1000); }); }; const fetchPosts = (userId) => { return new Promise((resolve) => { setTimeout(() => { resolve(["Post 1", "Post 2", "Post 3"]); // Simulated posts }, 1000); }); }; // Chaining Promises fetchUserData() .then(user => { console.log("User fetched:", user); return fetchPosts(user.userId); // Pass userId to the next promise }) .then(posts => { console.log("Posts fetched:", posts); }) .catch(error => { console.error("Error:", error); });
この例では、fetchUserData 関数はユーザー情報で解決される Promise を返します。解決された値は fetchPosts 関数に渡され、別の Promise が返されます。これらの Promise のいずれかが拒否された場合、エラーは最後の .catch() メソッドで捕捉され、チェーン全体で効果的なエラー処理が可能になります。
結論として、Promise は最新の JavaScript の重要な部分であり、開発者がより構造化された効率的な方法で非同期操作を処理できるようにします。 Promise を使用すると、次のことが可能になります:
Promise を独自のプロジェクトに実装すると、コードの可読性が向上するだけでなく、アプリケーションの応答性を維持することで全体的なユーザー エクスペリエンスも向上することがわかります。 JavaScript の基本概念を巡るこの旅が、開発者にとって貴重な洞察を提供できれば幸いです。コーディングを楽しんでください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3