Browse Source

refactor(alova): 重构响应成功拦截器处理逻辑

-移除自定义 ResponseData 接口,使用 alova 的 Response接口
- 重新定义 responseSuccessInterceptor 类型为 ResponseSuccessHandler
- 优化响应成功拦截器的执行流程
- 移除不必要的错误抛出和 JSON 解析
alova
Jin Mao 6 months ago
parent
commit
9b3cc2deb5
  1. 41
      packages/effects/plugins/src/alova/index.ts

41
packages/effects/plugins/src/alova/index.ts

@ -9,6 +9,7 @@ import type {
RespondedAlovaGenerics,
ResponseCompleteHandler,
ResponseErrorHandler,
ResponseSuccessHandler,
StatesHook,
} from 'alova';
import type {
@ -27,23 +28,6 @@ type RequestMethod<T extends AlovaGenerics = AlovaGenerics> = (
method: Method<T>,
) => Promise<void> | void;
/**
*
*/
interface ResponseData<T = unknown> {
code?: number;
data?: T;
message?: string;
[key: string]: unknown;
}
/**
*
*/
type ResponseSuccessMethod<T = unknown> = (
json: ResponseData<T>,
) => Promise<ResponseData<T>>;
/**
* Alova HTTP客户端封装类
* @template T AlovaGenerics
@ -69,7 +53,7 @@ class AlovaClient<T extends AlovaGenerics = AlovaGenerics> {
/**
*
*/
public responseSuccessInterceptor: ResponseSuccessMethod[] = [];
public responseSuccessInterceptor: ResponseSuccessHandler<T>[] = [];
/**
*
* @param options Alova配置选项
@ -77,12 +61,12 @@ class AlovaClient<T extends AlovaGenerics = AlovaGenerics> {
*/
constructor(
options: AlovaOptions<T>,
authOptions: TokenAuthenticationResult<
authOptions?: TokenAuthenticationResult<
StatesHook<any>,
AlovaRequestAdapterUnified
> = {},
>,
) {
const { onAuthRequired, onResponseRefreshToken } = authOptions;
const { onAuthRequired, onResponseRefreshToken } = authOptions || {};
const beforeRequest = async (method: Method<T>) => {
for (const interceptor of this.requestInterceptor) {
await interceptor(method);
@ -93,17 +77,13 @@ class AlovaClient<T extends AlovaGenerics = AlovaGenerics> {
// 当使用 `alova/fetch` 请求适配器时,第一个参数接收Response对象
// 第二个参数为当前请求的method实例,你可以用它同步请求前后的配置信息
onSuccess: async (response: Response, method: Method<T>) => {
if (response.status >= 400) {
throw new Error(response.statusText);
}
const json = await response.json();
let result = json;
let result: any = null;
for (const interceptor of this.responseSuccessInterceptor) {
result = await interceptor(json);
result = await interceptor(response, method);
if (result) {
return result;
}
}
return result;
},
onError: async (err: Error, method: Method<T>) => {
@ -124,7 +104,6 @@ class AlovaClient<T extends AlovaGenerics = AlovaGenerics> {
};
this.instance = createAlova({
baseURL: '',
requestAdapter: adapterFetch(),
statesHook: VueHook,
beforeRequest: onAuthRequired

Loading…
Cancel
Save