From 1716aff86e4f67acc13e4863d47c251fbf635fa0 Mon Sep 17 00:00:00 2001 From: HDTianRu <3291691454@qq.com> Date: Sun, 18 Aug 2024 15:53:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BAutils/request.js=E6=B7=BB=E5=8A=A0time?= =?UTF-8?q?out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/request.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/utils/request.js b/utils/request.js index e728ab8..4e99a5f 100644 --- a/utils/request.js +++ b/utils/request.js @@ -23,18 +23,24 @@ const _request = async (url, options) => { * @param {number} retry 重试次数 * @returns {Promise} */ -const request = (url, options, retry = 0) => { +const request = (url, options, retry = 0, timeout = 5000) => { let err; + const controller = new AbortController() + const { signal } = controller + const timeoutId = setTimeout(() => controller.abort(), timeout) + const _fetch = async (url, options, retryCount = 0) => { if (retryCount > retry) { throw new Error('Retry limit reached', err); } try { - return await _request(url, options); + return await _request(url, { signal, ...options }); } catch (error) { - logger.debug(`Fetch error: ${error.message}`); + logger.debug(error.name === 'AbortError' ? 'Request timed out' : `Fetch error: ${error.message}`); err = error; return await _fetch(url, options, retryCount + 1); + } finally { + clearTimeout(timeoutId) } }; return _fetch(url, options); @@ -49,8 +55,8 @@ const request = (url, options, retry = 0) => { */ request.get = async (url, data, options) => { const params = new URLSearchParams(data); - const { retry, ...restOptions } = options; - return request(`${url}?${params}`, restOptions, retry); + const { retry, timeout, ...restOptions } = options; + return request(`${url}?${params}`, restOptions, retry, timeout); }; /** @@ -62,8 +68,8 @@ request.get = async (url, data, options) => { */ request.post = async (url, data, options) => { const body = JSON.stringify(data); - const { retry, ...restOptions } = options; - return request(url, { ...restOptions, method: 'POST', body }, retry); + const { retry, timeout, ...restOptions } = options; + return request(url, { ...restOptions, method: 'POST', body }, retry, timeout); }; export default request;