在非同步 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中文網其他相關文章!