diff --git a/src/api/foo.ts b/src/api/foo.ts index cfa39a5..a500002 100644 --- a/src/api/foo.ts +++ b/src/api/foo.ts @@ -21,8 +21,8 @@ export interface IFooItem { } /** GET 请求 */ -export function getFooAPI(name: string) { - return http.get('/foo', { name }) +export async function getFooAPI(name: string) { + return await http.get('/foo', { name }) } /** GET 请求;支持 传递 header 的范例 */ export function getFooAPI2(name: string) { diff --git a/src/hooks/useRequest.ts b/src/hooks/useRequest.ts index 7aa7bc6..7eae39e 100644 --- a/src/hooks/useRequest.ts +++ b/src/hooks/useRequest.ts @@ -26,7 +26,7 @@ interface IUseRequestReturn { * @returns 返回一个对象{loading, error, data, run},包含请求的加载状态、错误信息、响应数据和手动触发请求的函数。 */ export default function useRequest( - func: (args?: P) => HttpRequestResult, + func: (args?: P) => Promise | Promise> | HttpRequestResult | T, options: IUseRequestOptions = { immediate: false }, ): IUseRequestReturn { const loading = ref(false) @@ -36,12 +36,36 @@ export default function useRequest( const run = async (args?: P) => { loading.value = true - const { promise, requestTask: task } = func(args) - requestTask = task // Store the requestTask + error.value = false // Move error reset to the beginning + 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 + return p + } + return res as T | undefined + }) as Promise // Cast to ensure correct type + } + 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) => { data.value = res - error.value = false return data.value }) .catch((err) => {