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;
};
相关推荐
LlNingyu3 分钟前
文艺复兴,什么是XSS,常见形式(一)
前端·安全·web安全·xss
英俊潇洒美少年8 分钟前
js 进程与线程的讲解
javascript
dleei1 小时前
彻底淘汰老旧 SVG 插件:unplugin-icons 与 Tailwind CSS v4 自定义图标最佳实践
前端·程序员·前端框架
LlNingyu2 小时前
文艺复兴,什么是XSS,常见形式(二)
前端·安全·xss
汉堡大王95272 小时前
# AI 终于能"干活"了——Function Calling 完全指南
javascript·人工智能·机器学习
明君879972 小时前
说说我为什么放弃使用 GetX,转而使用 flutter_bloc + GetIt
前端·flutter
Jingyou2 小时前
用 Astro 搭建个人博客:从零到上线的完整实践
前端
吴声子夜歌2 小时前
JavaScript——call()、apply()和bind()
开发语言·前端·javascript
小哈猪2 小时前
CSS Flex 与 Grid:谁才是布局之王?
javascript
高桥凉介发量惊人2 小时前
质量与交付篇(2/6):CI/CD 实战——自动构建、签名、分发
前端