導入
非同期処理は、現代のアプリケーション開発において不可欠な要素です。特に、TypeScriptを使用することで、型安全性を保ちながら非同期処理を行うことが可能になります。本記事では、実務でよく遭遇する非同期処理の具体的なシチュエーションを元に、よくある質問とその回答を通じて、非同期処理の理解を深めます。
教科書レベルの解説(非同期処理)
重要な概念の整理
非同期処理では、主にPromise、async/await、コールバック関数の3つの概念が重要です。Promiseは非同期処理の結果を表現するオブジェクトであり、async/awaitはそのPromiseをより簡潔に扱うための構文です。また、コールバック関数は非同期処理の完了時に実行される関数ですが、過度に使用すると「コールバック地獄」と呼ばれる問題を引き起こすことがあります。
コード例(TypeScript)
async function fetchData(url: string): Promise {
const response = await fetch(url);
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
}
async function processData() {
try {
const data = await fetchData('https://api.example.com/data');
console.log(data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
processData();
コードの行ごとの解説
async function fetchData(url: string): Promise– 非同期関数を定義し、URLを引数として受け取ります。{ const response = await fetch(url);– fetch APIを使用してデータを取得し、結果を待機します。if (!response.ok) { throw new Error('Network response was not ok'); }– レスポンスが正常でない場合、エラーをスローします。return response.json();– レスポンスをJSON形式で返します。async function processData() {– データを処理するための別の非同期関数を定義します。const data = await fetchData('https://api.example.com/data');– fetchData関数を呼び出し、データを取得します。console.log(data);– 取得したデータをコンソールに表示します。catch (error) { console.error('Error fetching data:', error); }– エラーが発生した場合、エラーメッセージを表示します。
Q&A編
以下に、非同期処理に関するよくある質問とその回答を示します。
- Q1: Promiseの状態にはどのようなものがありますか?
A1: Promiseには、未解決(pending)、解決(fulfilled)、拒否(rejected)の3つの状態があります。 - Q2: async/awaitを使用する利点は何ですか?
A2: コードが直線的になり、コールバック関数を使用するよりもエラーハンドリングが簡潔になります。 - Q3: コールバック地獄を避ける方法は?
A3: Promiseやasync/awaitを使用することで、ネストを減らし、コードをより読みやすくできます。 - Q4: 非同期処理のエラーハンドリングはどう行うべきですか?
A4: try/catchブロックを使用して、非同期関数内で発生したエラーを捕捉するのが一般的です。 - Q5: 複数の非同期処理を同時に実行する方法は?
A5: Promise.allを使用すると、複数のPromiseを並行して処理できます。 - Q6: fetch APIの使い方に注意すべき点は?
A6: ネットワークエラーやレスポンスのステータスコードに注意し、適切にエラーハンドリングを行う必要があります。
まとめ
- 非同期処理は、現代のアプリケーションにおいて重要な役割を果たします。
- TypeScriptを使用することで、型安全な非同期処理が実現できます。
- 実務での具体的なシチュエーションを通じて、非同期処理の理解が深まります。