導入
非同期処理は、JavaScriptの特性を活かしたプログラミング手法の一つです。特に、APIからデータを取得する際や、ユーザーインターフェースの応答性を保つために不可欠です。本記事では、具体的なシチュエーションを通じて、非同期処理の実践的な利用法とその落とし穴について解説します。
教科書レベルの解説(非同期処理)
重要な概念の整理
非同期処理では、処理が完了するのを待たずに次の処理を進めることができます。これにより、プログラムの効率が向上し、ユーザーにとって快適な体験を提供できます。Promiseやasync/awaitといった構文は、非同期処理を簡潔に記述するための重要なツールです。特に、async/awaitは可読性が高く、エラーハンドリングも容易です。
コード例(JavaScript)
// APIからデータを取得し、処理を行う非同期関数
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
processData(data);
} catch (error) {
console.error('Fetch error:', error);
}
}
// データ処理関数
function processData(data) {
console.log('Received data:', data);
}
// 関数を呼び出す
fetchData();
コードの行ごとの解説
- async function fetchData() { – 非同期関数を定義します。
- const response = await fetch(‘https://api.example.com/data’); – fetch関数を使ってデータを取得し、完了を待ちます。
- if (!response.ok) { throw new Error(‘Network response was not ok’); } – HTTPレスポンスが正常でない場合、エラーをスローします。
- const data = await response.json(); – レスポンスをJSON形式に変換し、完了を待ちます。
- processData(data); – 取得したデータを処理する関数を呼び出します。
- catch (error) { console.error(‘Fetch error:’, error); } – エラーが発生した場合、コンソールにエラーメッセージを表示します。
練習問題編
以下の練習問題を解いて、非同期処理に関する理解を深めてください。
-
問題1: fetchData関数にタイムアウト機能を追加してください。
// 例: タイムアウトを設定するコード async function fetchDataWithTimeout(url, timeout) { const controller = new AbortController(); const signal = controller.signal; const fetchPromise = fetch(url, { signal }); const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Request timed out')), timeout) ); try { const response = await Promise.race([fetchPromise, timeoutPromise]); // ここにレスポンス処理を追加 } catch (error) { console.error('Error:', error); } } -
問題2: エラーハンドリングを強化するために、fetchData関数を改良してください。
// 例: エラーメッセージをユーザーに表示するコード async function fetchData() { try { // fetch処理 } catch (error) { alert('データの取得に失敗しました: ' + error.message); } } -
問題3: 取得したデータをHTMLに表示する関数を作成してください。
// 例: データをリストとして表示する関数 function displayData(data) { const list = document.createElement('ul'); data.forEach(item => { const listItem = document.createElement('li'); listItem.textContent = item.name; // itemのプロパティ名に応じて変更 list.appendChild(listItem); }); document.body.appendChild(list); }
まとめ
- 非同期処理は、ユーザー体験を向上させるために不可欠です。
- Promiseやasync/awaitを活用することで、可読性の高いコードが書けます。
- エラーハンドリングを適切に行うことで、予期しない問題に対処できます。