首页 >web前端 >js教程 >在 JavaScript 中处理异步超时的 AbortController 替代方案

在 JavaScript 中处理异步超时的 AbortController 替代方案

Linda Hamilton
Linda Hamilton原创
2024-12-07 09:42:12948浏览

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