Vue3 axios 请求设置 signal 信号属性,以便 abort 取消请求

api:

taskMessage.ts

TypeScript 复制代码
// 通过用户名(账号),查询任务列表
export const taskService = (signal?: AbortSignal) => {
  return request.get("/task", {
    // 设置 signal 信号属性,后续就可以通过 abort 取消请求
    signal: signal
  });
};

// 通过用户名(账号),查询消息列表
export const messageService = (signal?: AbortSignal) => {
  return request.get("/message", {
    // 设置 signal 信号属性,后续就可以通过 abort 取消请求
    signal: signal
  });
};

发送 / 取消请求:

useFetchService.ts

TypeScript 复制代码
import { onUnmounted, ref, type Ref } from "vue";
import type { AxiosResponse } from "axios";

interface IFetchResponse<T> {
  data: Ref<T[]>;
  error: Ref<string>;
  isLoading: Ref<boolean>;
  refetch: () => Promise<void>;
}

/**
 * 请求服务 hook
 * @param service 请求服务方法
 * @param args 请求参数
 * @returns
 */
export const useFetchService = async <T>(
  service: (...args: any[]) => Promise<AxiosResponse<any, any>>,
  args: any[] = []
) => {
  // 请求服务
  const fetchService = async () => {
    try {
      state.isLoading.value = true;
      state.data.value = [];
      state.error.value = "";
      // 在参数数组中增加设置信号 AbortSignal,关联请求,以便能取消请求
      args.push(controller.signal);
      const result = await service(...args);
      state.data.value = result.data;
    } catch (error) {
      state.error.value = `服务调用失败: ${service.name}` + error;
      console.error(state.error.value);
    } finally {
      state.isLoading.value = false;
    }
  };
  // 创建及初始化状态
  const state: IFetchResponse<T> = {
    data: ref([]),
    error: ref(""),
    isLoading: ref(false),
    refetch: fetchService
  };
  // 创建 AbortController 用于取消请求
  const controller = new AbortController();

  onUnmounted(() => {
    // 取消请求
    controller.abort();
  });

  // 执行请求服务
  await fetchService();

  // 返回状态
  return state;
};
相关推荐
小桥风满袖2 分钟前
Three.js-硬要自学系列38之专项学习缓冲几何体
前端·css·three.js
Rubin932 分钟前
埋点方案实现
前端
斯~内克6 分钟前
Centrifugo 深度解析:构建高性能实时应用的开源引擎
前端·开源
tianchang18 分钟前
策略模式(Strategy Pattern)深入解析与实战应用
前端·javascript·代码规范
best66620 分钟前
JavaScript的Math内置对象,到底是何方神圣?
javascript
掘金安东尼26 分钟前
技术解析:高级 Excel 财务报表解析器的架构与实现
前端·javascript·面试
Hilaku27 分钟前
深入CSS层叠的本质:@layer如何优雅地解决样式覆盖与!important滥用问题
前端·css·html
天天扭码31 分钟前
AI时代,前端如何处理大模型返回的多模态数据?
前端·人工智能·面试
每天开心33 分钟前
一文教你掌握事件机制
前端·javascript·ai编程
LeeAt40 分钟前
真的!真的就一句话就能明白this指向问题
前端·javascript