首頁 >web前端 >js教程 >在 JavaScript 中處理非同步逾時的 AbortController 替代方案

在 JavaScript 中處理非同步逾時的 AbortController 替代方案

Linda Hamilton
Linda Hamilton原創
2024-12-07 09:42:12950瀏覽

Alternative to AbortController for Handling Async Timeouts in JavaScript

在非同步 JavaScript 的世界中,了解如何處理超時和取消不僅涉及 AbortController 等工具,還涉及為每種場景打造彈性且適應性強的解決方案。

AbortController API 已成為處理任務取消的首選解決方案,尤其是在現代專案中。然而,它並不總是理想的選擇,甚至不是可用的選擇,這取決於您所處的上下文或環境。

在本部落格中,我們將探索在不依賴 AbortController 的情況下管理非同步逾時的替代方法。

async function customAbortController(asyncFunction, timeout = 5000) {
  return async (...args) => {
    const timeoutPromise = new Promise((_, reject) => {
      const id = setTimeout(() => {
        clearTimeout(id)
        reject(new Error(`Operation timed out after ${timeout} ms`))
      }, timeout)
    })
    try {
      return await Promise.race([asyncFunction(...args), timeoutPromise])
    } catch (error) {
      throw error
    }
  }
}

const abortControllerWrapper = async (asyncFunction, params) => {
  const response = await customAbortController(asyncFunction, 5000)
  return response(params);
}

// Example usage
const getUsers = async () => {
  const response = await fetch('https://jsonplaceholder.typicode.com/users')
  // handle response the way you prefer.
}

const getTodoById = async (id) => {
  const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${id}`)
  // handle response the way you prefer.
}

const loadUsers = async () => {
  try {
    const response = await abortControllerWrapper(getUsers);
    // handle response the way you prefer.
  } catch (error) {
    console.error("ERROR", error.message) // "Operation timed out after 5000 ms"
  }
}
loadUsers();

// Try out yourself for getTodoById ?

我們到底在做什麼?

在 Javascript 中,Promise 沒有任何官方的方式來取消自身。

所以我們在這裡利用 Promise.race() 方法。

我們正在創建一個虛擬的 Promise,它會在給定的時間內解析並與實際的 API 呼叫競爭,這樣我們要么得到 API 響應,要么在超時後 Promise 被拒絕。

我希望這段程式碼有幫助? !

請隨意根據您的需求進行定制,並讓我知道您的感受❤️

以上是在 JavaScript 中處理非同步逾時的 AbortController 替代方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn