From a8ec7f7beb03a9bf875ed5a9ca6ed984a076b5da Mon Sep 17 00:00:00 2001 From: liaochunxin Date: Tue, 23 Sep 2025 15:53:38 +0800 Subject: [PATCH] =?UTF-8?q?fix(useRequest):=20=E4=BF=AE=E5=A4=8D=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E8=AF=B7=E6=B1=82=E6=97=B6=E6=9C=AA=E6=8D=95=E8=8E=B7?= =?UTF-8?q?=E7=9A=84=20Promise=20=E9=94=99=E8=AF=AF=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=B8=94=E7=BD=91=E7=BB=9C=E8=AF=B7=E6=B1=82=E6=9C=AC=E8=BA=AB?= =?UTF-8?q?=E4=B9=9F=E4=BC=9A=E8=A2=AB=E4=B8=AD=E6=AD=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useRequest.ts | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/hooks/useRequest.ts b/src/hooks/useRequest.ts index 7eae39e..1290dbd 100644 --- a/src/hooks/useRequest.ts +++ b/src/hooks/useRequest.ts @@ -33,44 +33,55 @@ export default function useRequest( const error = ref(false) const data = ref(options.initialData) as Ref let requestTask: UniApp.RequestTask | undefined + const isCancelled = ref(false) - const run = async (args?: P) => { + const run = async (args?: P): Promise => { loading.value = true - error.value = false // Move error reset to the beginning + error.value = false + isCancelled.value = false let promise: Promise const result = func(args) if (result instanceof Promise) { - // If func returns a Promise promise = result.then((res) => { if (res && typeof (res as HttpRequestResult).promise === 'object' && typeof (res as HttpRequestResult).requestTask === 'object') { - // If the resolved value is HttpRequestResult const { promise: p, requestTask: task } = res as HttpRequestResult requestTask = task + if (isCancelled.value) { + task.abort() + throw new Error('Request cancelled') + } return p } + if (isCancelled.value) { + throw new Error('Request cancelled') + } return res as T | undefined - }) as Promise // Cast to ensure correct type + }) as Promise } else if (result && typeof (result as HttpRequestResult).promise === 'object' && typeof (result as HttpRequestResult).requestTask === 'object') { - // If func returns HttpRequestResult directly const { promise: p, requestTask: task } = result as HttpRequestResult requestTask = task promise = p } else { - // If func returns T directly promise = Promise.resolve(result as T | undefined) } return promise .then((res) => { + if (isCancelled.value) { + return + } data.value = res return data.value }) .catch((err) => { - error.value = err - throw err + if (!isCancelled.value) { + error.value = err + throw err + } + return Promise.resolve(undefined) }) .finally(() => { loading.value = false @@ -78,11 +89,12 @@ export default function useRequest( } const cancel = () => { + isCancelled.value = true if (requestTask) { requestTask.abort() - loading.value = false // Reset loading state on cancel - error.value = new Error('Request cancelled') // Set a specific error for cancellation } + loading.value = false + error.value = new Error('Request cancelled') } if (options.immediate) {