当前位置: 首页 > article >正文

处理多个axios请求

代码中使用了两个独立的 Axios 请求来获取角色数据和动作数据。由于这些请求是异步执行的,JavaScript 不会等待它们完成,而是继续往下执行。
这可能导致在你尝试使用 agentdata 或 actiondata 变量时,它们可能仍然是空数组,因为在 console.log 或其他操作执行时,这些请求可能尚未完成,数据还未被赋值给这些变量。

1.使用回调函数

将每个请求的处理逻辑放入一个单独的函数,并在每个请求的 .then() 方法中调用这些函数。这种方法可以使代码更模块化,但可能会导致回调地狱。

function handleAgentData(response) {
  if (response.data.success) {
    agentdata = response.data.data;
    // 处理 agentdata
  }
}

function handleActionData(response) {
  if (response.data.success) {
    actiondata = response.data.data;
    // 处理 actiondata
  }
}

axios.post("/proxy_url/getAllAgentData", { "pageNo": 0, "pageSize": 10000 })
  .then(handleAgentData)
  .then(() => axios.post("/proxy_url/getAllActionData", { "pageNo": 0, "pageSize": 10000 }))
  .then(handleActionData)
  .catch(error => {
    console.error("Error fetching data:", error);
  });

2.使用第三方库或工具

有一些第三方库或工具(比如 async、lodash 等)提供了更高级的异步操作处理方式,例如 async.series、async.parallel 或 Promise.map 等,可以更方便地处理多个异步请求。这些库可以简化并发请求的管理,但需要额外引入库和学习其使用方法。

3.使用 Promise链式调用

可以通过将一个请求的 .then() 方法链接到另一个请求的 .then() 方法来执行多个异步操作。这种方法可以在一定程度上解决嵌套回调的问题,但可读性可能会降低。

axios.post("/proxy_url/getAllAgentData", { "pageNo": 0, "pageSize": 10000 })
  .then(response => {
    if (response.data.success) {
      agentdata = response.data.data;
      // 处理 agentdata

      // 返回另一个 Promise 对象以进行链式调用
      return axios.post("/proxy_url/getAllActionData", { "pageNo": 0, "pageSize": 10000 });
    }
  })
  .then(response => {
    if (response.data.success) {
      actiondata = response.data.data;
      // 处理 actiondata
    }
    // 在这里同时处理 agentdata 和 actiondata
    // 由于异步性质,这里可能无法保证两者都已经获取完毕
    // 所以最好的方式还是在各自的处理逻辑中进行操作
  })
  .catch(error => {
    console.error("Error fetching data:", error);
  });

4.使用 Async/Await

使用 async/await 结合 try/catch 语句可以更清晰地处理多个异步请求。这种方法让代码看起来更像是同步的,易于理解和维护。

async function fetchData() {
  try {
    const response1 = await axios.post("/proxy_url/getAllAgentData", { "pageNo": 0, "pageSize": 10000 });
    const response2 = await axios.post("/proxy_url/getAllActionData", { "pageNo": 0, "pageSize": 10000 });

    if (response1.data.success) {
      agentdata = response1.data.data;
      // 处理 agentdata
    }

    if (response2.data.success) {
      actiondata = response2.data.data;
      // 处理 actiondata
    }
  } catch (error) {
    console.error("Error fetching data:", error);
  }
}

fetchData();

5.使用 Promise.all

等待两个请求都成功完成后再处理数据。这是一种更好的处理方式,可以确保在两个请求都成功获取数据后再进行处理。

let agentdata = [], actiondata = [];

// 发起两个请求
const request1 = axios({
  method: "post",
  url: "/proxy_url/getAllAgentData",
  data: {
    "pageNo": 0,
    "pageSize": 10000
  }
});

const request2 = axios({
  method: "post",
  url: "/proxy_url/getAllActionData",
  data: {
    "pageNo": 0,
    "pageSize": 10000
  }
});

// 使用 Promise.all 来等待两个请求都完成
Promise.all([request1, request2])
  .then(responses => {
    // 处理第一个请求的响应
    if (responses[0].data.success) {
      agentdata = responses[0].data.data;
      // 在这里处理 agentdata
    }

    // 处理第二个请求的响应
    if (responses[1].data.success) {
      actiondata = responses[1].data.data;
      // 在这里处理 actiondata
    }
  })
  .catch(error => {
    // 处理错误
    console.error("Error fetching data:", error);
  });

http://www.kler.cn/a/133597.html

相关文章:

  • 使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)
  • STM32问题集
  • AI大模型开发架构设计(18)——基于大模型构建企业知识库案例实战
  • 什么时候需要复写hashcode()和compartTo方法
  • 计算机网络(3)网络拓扑和IP地址,MAC地址,端口地址详解
  • WPF学习之路,控件的只读、是否可以、是否可见属性控制
  • Hive 定义变量 变量赋值 引用变量
  • centos 安装 docker
  • echarts双轴刻度线y轴刻度线对齐
  • 支持4KHz回报还能无线充电,简约不简单的雷柏VT3S游戏鼠标上手
  • Mongodb 副本集名称重命名
  • Vue3 动态设置 ref
  • 2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序
  • 使用html2canvas转换table为图片时合并单元格rowspan失效,无边框显示问题解决(React实现)
  • python从基础到UnitTest框架-python基础语法
  • iOS_折叠展开 FoldTextView
  • 手机LiDAR-based激光雷达标定板提高无人汽车智能化程度
  • Nas搭建webdav服务器并同步Zotero科研文献
  • 持续集成部署-k8s-配置与存储-配置管理:SubPath
  • 新版JetBrains ToolBox【Windows】修改应用安装位置
  • Node.js之path路径模块
  • ubuntu22.04换源
  • NSSCTF第13页(2)
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(十二)
  • golang学习笔记——select 判断语句
  • 动态加载js文件的方法封装