#vue中解决异步请求的竞态

news2025/3/31 7:09:23
// composables/useFetchWithoutRace.js
import { ref } from 'vue';
import axios from 'axios';

// 定义一个可复用的 Composition 函数,处理带有竞态控制的异步请求
export function useFetchWithoutRace() {
  // 定义响应式变量 `latestRequestId`,用于追踪最新请求的标识
  const latestRequestId = ref(null);

  // 定义异步请求函数,接收 AJAX 配置对象,返回请求结果
  const fetchWithoutRace = async (ajaxConfig) => {
    // 生成当前请求的唯一标识,使用时间戳确保每次请求都有不同的 ID
    const requestId = Date.now();
    
    // 更新 `latestRequestId`,标记这个请求为最新的
    latestRequestId.value = requestId;

    try {
      // 使用传入的 ajaxConfig 发送请求,axios 会根据配置自动处理 method、url、params 等
      const response = await axios(ajaxConfig);
      
      // 检查当前请求的 ID 是否仍然是最新的
      if (requestId === latestRequestId.value) {
        // 如果是最新的请求,直接返回响应数据
        return response.data;
      }
      // 如果不是最新的请求,返回 null 或抛出特定标识,避免使用旧数据
      return null;
    } catch (error) {
      // 捕获请求中的错误,抛出以便调用者处理
      console.error('Fetch error:', error);
      throw error;
    }
  };

  // 返回 `fetchWithoutRace` 方法,供组件调用
  return {
    fetchWithoutRace, // 请求方法,返回 Promise,包含结果或 null
  };
}

在组件中使用

// 组件代码
<script>
import { ref } from 'vue';
import { useFetchWithoutRace } from '@/composables/useFetchWithoutRace';

export default {
  setup() {
    // 调用 useFetchWithoutRace,获取 fetchWithoutRace 方法
    const { fetchWithoutRace } = useFetchWithoutRace();
    
    // 定义响应式变量,用于存储结果
    const result = ref(null);

    // 定义处理输入的方法,构造 AJAX 配置对象并调用 fetchWithoutRace
    const handleInput = async (value) => {
      // 创建 AJAX 配置对象
      const ajaxConfig = {
        url: '/api/data',       // 请求的 API 地址
        method: 'get',         // 请求方法,默认为 GET
        params: { q: value },  // 查询参数,传递输入框的值
      };
      
      try {
        // 调用 fetchWithoutRace,等待结果
        const data = await fetchWithoutRace(ajaxConfig);
        // 如果是最新请求,data 会有值;否则为 null
        if (data !== null) {
          result.value = data;
        }
      } catch (error) {
        // 处理请求错误
        console.log('处理错误:', error);
      }
    };

    // 返回给模板使用的变量和方法
    return {
      result,      // 请求结果,用于显示
      handleInput, // 输入处理方法,绑定到输入框
    };
  },
};
</script>

<template>
  <div>
    <!-- 输入框,每次输入时调用 handleInput,传入输入值 -->
    <input @input="handleInput($event.target.value)" placeholder="输入查询" />
    <!-- 显示请求结果,result 是响应式的,数据更新时自动刷新 -->
    <p>结果: {{ result }}</p>
  </div>
</template>

让调用者自己管理结果, fetchWithoutRace 直接返回请求数据。

fetchWithoutRace 返回一个 Promise,成功时解析为:
如果是最新请求,返回 response.data。
如果不是最新请求,返回 null。
失败时抛出错误,交给调用者处理。

竞态控制:
依然通过 requestId 和 latestRequestId 判断,只有最新请求的结果会被返回。
非最新请求返回 null,避免旧数据干扰。

调用者控制结果:
组件中用 await fetchWithoutRace(ajaxConfig) 获取结果,然后手动赋值给 result。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BP神经网络+NSGAII算法(保真)

BP神经网络NSGAII算法 非常适合用来当作实验验证自己的结论&#xff0c;构建一个神经网络模型&#xff0c;并使用NSGAII多目标优化算法来实现多领域的毕业论文的设计。仅仅使用简单的matlab代码就可以实现自己的多目标优化任务。 BP神经网络算法 我的任务是预测三个变量的值…

每日一题-力扣-2829. k-avoiding 数组的最小总和 0326

解决"k-avoiding 数组的最小总和"问题 这道题有两种主要解法。 解法一&#xff1a;直接数学计算&#xff08;最优解&#xff09; 通过数学推导直接计算出结果&#xff0c;不需要构建实际的数组。 class Solution:def minimumSum(self, n: int, k: int) -> int…

OSI模型_TCP/IP模型_五层模型

文章目录 OSI模型_TCP/IP模型_五层模型模型对比模型层级对比关键区别对比 OSI模型OSI模型概述举例说明流程图示 TCP/IP 四层模型模型结构举例说明流程图示 TCP/IP 五层模型模型的结构举例说明流程图示 OSI模型_TCP/IP模型_五层模型 学OSI&#xff0c;用TCP/IP&#xff0c;分析选…

SpringCould微服务架构之Docker(2)

Docker和虚拟机的差别&#xff1a; 虚拟机是在操作系统中模拟硬件设备&#xff0c;然后运行另外一个操作系统。

LINUX基础IO [六] - 文件理解与操作

目录 前言 C语言文件操作回顾 文件的打开与关闭 文件的增删改查 文件系统调用 比特位方式的标志位传递原理 访问文件的本质 文件描述符fd 理解文件描述符fd 三个流的理解 文件描述符的分配规则 重定向再理解 输出重定向 输入重定向 如何理解一切皆文件 理解…

拥抱人工智能大模型时代:大模型会改变我们的生活吗?

在这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活和工作方式。尤其是随着人工智能大模型&#xff08;如ChatGPT、DeepSeek等&#xff09;的崛起&#xff0c;人们对于AI技术的期待和关注达到了前所未有的高度。那么&…

常见框架漏洞攻略-ThinkPHP篇

漏洞名称&#xff1a;Thinkphp5x远程命令执行及getshell 第一步&#xff1a;开启靶场 第二步&#xff1a;准备工具 第三步&#xff1a;启动工具&#xff0c;进行漏洞检测 #存在漏洞 1.目标存在tp5_invoke_func_code_exec_1漏洞2.目标存在tp5_dbinfo_leak漏洞payload:http://47…

LlamaFactory部署及模型微调【win10环境】

1.Llama-Factory简介 LLaMA-Factory&#xff0c;全称 Large Language Model Factory&#xff0c;旨在简化大模型的微调过程&#xff0c;帮助开发者快速适应特定任务需求&#xff0c;提升模型表现。它支持多种预训练模型和微调算法&#xff0c;适用于智能客服、语音识别、机器翻…

vue3配置代理实现axios请求本地接口返回PG库数据【前后端实操】

前端编写 安装 axios 如果当前未安装axios&#xff0c;可以执行如下指令安装 npm install axios配置代理 当前为基于Vite构建的项目&#xff0c;在 vite.config.ts 中配置代理&#xff0c;在defineConfig中新增server配置&#xff0c;主要关注两个点&#xff1a; 一、需要代…

trae 配置 gradle springboot项目

一 本机安装gradle 1.下载gradle &#xff1a; https://github.com/gradle/gradle-distributions/releases/download/v8.13.0/gradle-8.13-all.zip 2.配置相关环境变量&#xff1a; GRADLE_HOME&#xff1a;本地的gradle路径。 GRADLE_USER_HOME&#xff1a;gradle 本地仓…

uv:Rust 驱动的 Python 包管理新时代

在 Python 包管理工具层出不穷的今天&#xff0c;pip、pip-tools、poetry、conda 等各有千秋。而今天要介绍的 uv&#xff0c;则是一款由 Astral 团队推出、采用 Rust 编写的全新工具&#xff0c;目标直指成为 “Python 的 Cargo”。它不仅在性能上表现优异&#xff0c;而且在功…

sqlserver 阻止保存要求重新创建表的更改

1 选择 “工具” 菜单&#xff0c;然后点击 “选项” 2 进入选项界面后&#xff0c;选择 “设计器”&#xff0c;取消勾选 “阻止保存要求重新创建表的更改” 选项&#xff0c;点击 “确定”

5.Excel:从网上获取数据

一 用 Excel 数据选项卡获取数据的方法 连接。 二 要求获取实时数据 每1分钟自动更新数据。 A股市场_同花顺行情中心_同花顺财经网 用上面方法将数据加载进工作表中。 在表格内任意区域右键&#xff0c;刷新。 自动刷新&#xff1a; 三 缺点 Excel 只能爬取网页上表格类型的…

在word中使用zotero添加参考文献并附带超链接

一、引言 在写大论文时&#xff0c;为了避免文中引用与文末参考文献频繁对照、修改文中引用顺序/引用文献时手动维护参考文献耗易出错&#xff0c;拟在 word 中使用 zotero 插入参考文献&#xff0c;并为每个参考文献附加超链接&#xff0c;实现交互式阅读。 版本&#xff1a…

性能测试、负载测试、压力测试的全面解析

在软件测试领域&#xff0c;性能测试、负载测试和压力测试是评估系统稳定性和可靠性的关键手段。​它们各自关注不同的测试目标和应用场景&#xff0c;理解这些差异对于制定有效的测试策略至关重要。 本文对性能测试、负载测试和压力测试进行深入分析&#xff0c;探讨其定义、…

Redis中的数据类型与适用场景

目录 前言1. 字符串 (String)1.1 特点1.2 适用场景 2. 哈希 (Hash)2.1 特点2.2 适用场景 3. 列表 (List)3.1 特点3.2 适用场景 4. 集合 (Set)4.1 特点4.2 适用场景 5. 有序集合 (Sorted Set)5.1 特点5.2 适用场景 6. Redis 数据类型的选型建议结语 前言 Redis 作为一款高性能的…

gz sim机器人SDF模型 [持续更新]

机器人SDF模型 linklink的一级pose材质 plugin话题信息通信键盘操作plugin Sensor传感器imu 不算教学&#xff0c;个人的记录 sdf的格式跟urdf有所不同&#xff0c;必须是完整的一个包括&#xff0c;比如< pose></ pose>这样前一个后一个&#xff0c;urdf中是有<…

【MySQL | 六、索引特性(进一步理解)】

目录 索引的理解索引的作用MySQL与磁盘的IOPage单个Page的分类多个Page的组织B树的特点 B树和B树的区别聚簇索引 VS 非聚簇索引聚簇索引的优缺点非聚簇索引的优缺点 创建索引常见索引分为&#xff1a;主键索引InnoDB主键索引的生成过程&#xff08;1&#xff09;初始化&#xf…

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…

【测试开发】OKR 小程序端黑盒测试报告

【测试报告】OKR 小程序端 项目名称版本号测试负责人测试完成日期联系方式OKR 小程序端4.0马铭胜2025-03-2515362558972 1、项目背景 1.1 OKR 用户端 在如今这个快节奏的时代中&#xff0c;个人和组织的成长往往依赖于清晰、明确且意义深远的目标。然而&#xff0c;如何设定…