在异步 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中文网其他相关文章!