JavaScript非同期処理の完全ガイド

JavaScriptの非同期処理について、Promise、async/await、エラーハンドリングまで詳しく解説します。

|

JavaScript非同期処理の完全ガイド

JavaScriptの非同期処理をマスターして、効率的なコードを書きましょう。

Promiseの基本

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const success = Math.random() > 0.5
      if (success) {
        resolve({ data: 'Success!' })
      } else {
        reject(new Error('Failed to fetch data'))
      }
    }, 1000)
  })
}

fetchData()
  .then(result => console.log(result))
  .catch(error => console.error(error))

async/awaitの使い方

async function getData() {
  try {
    const result = await fetchData()
    console.log(result)
    return result
  } catch (error) {
    console.error('Error:', error.message)
    throw error
  }
}

// 複数の非同期処理
async function fetchMultipleData() {
  try {
    const [user, posts, comments] = await Promise.all([
      fetchUser(),
      fetchPosts(),
      fetchComments()
    ])
    
    return { user, posts, comments }
  } catch (error) {
    console.error('One or more requests failed:', error)
  }
}

実践的な例:API呼び出し

class ApiClient {
  constructor(baseURL) {
    this.baseURL = baseURL
  }

  async request(endpoint, options = {}) {
    const url = `${this.baseURL}${endpoint}`
    
    try {
      const response = await fetch(url, {
        headers: {
          'Content-Type': 'application/json',
          ...options.headers
        },
        ...options
      })

      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`)
      }

      return await response.json()
    } catch (error) {
      console.error('API request failed:', error)
      throw error
    }
  }

  async get(endpoint) {
    return this.request(endpoint)
  }

  async post(endpoint, data) {
    return this.request(endpoint, {
      method: 'POST',
      body: JSON.stringify(data)
    })
  }
}

// 使用例
const api = new ApiClient('https://api.example.com')

async function loadUserData(userId) {
  try {
    const user = await api.get(`/users/${userId}`)
    const posts = await api.get(`/users/${userId}/posts`)
    
    return { user, posts }
  } catch (error) {
    console.error('Failed to load user data:', error)
  }
}

非同期処理を適切に扱うことで、パフォーマンスの良いアプリケーションを構築できます。