You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环中使用Axios发送POST请求时重复提交最后一项的问题

解决Axios循环发送POST请求重复提交最后一项的问题

这个问题我之前也踩过坑!核心原因是JavaScript引用类型的特性在搞鬼——你在循环里直接复用了req.chasm.chatResponse这个对象的引用,所有请求最终都指向同一个内存地址的对象。当循环走到最后一次时,这个对象的attachments被改成了最后一项,导致所有请求都用了这个最终修改后的对象。

具体修复方案

我们需要确保每次循环都创建一个独立的chatResponse对象,彻底避免引用共享,这里有两种简单好用的实现方式:

方式1:深拷贝对象(推荐,适配嵌套对象场景)

把原对象深拷贝一份,这样每次循环的chatResponse都是全新的独立对象,修改不会影响其他请求:

async sendMessage(req) {
  let axiosArray = [];
  const loopCount = req.chasm.attachments.length || 1;

  for (let i = 0; i < loopCount; i += 1) {
    // 深拷贝原chatResponse,创建完全独立的新对象
    let chatResponse = JSON.parse(JSON.stringify(req.chasm.chatResponse));
    if (i > 0 && req.chasm.attachments[i]) {
      chatResponse.attachments = req.chasm.attachments[i];
    }
    const newPromise = axios({
      method: 'post',
      url: this.serviceUri,
      data: chatResponse
    });
    axiosArray.push(newPromise);
  }

  // 等待所有请求完成并返回结果
  return Promise.all(axiosArray);
}

方式2:扩展运算符浅拷贝(适用于无嵌套的简单对象)

如果chatResponse是没有嵌套结构的简单对象,用扩展运算符快速创建新对象也可以:

async sendMessage(req) {
  let axiosArray = [];
  const loopCount = req.chasm.attachments.length || 1;

  for (let i = 0; i < loopCount; i += 1) {
    // 用扩展运算符复制原对象,按需覆盖attachments属性
    let chatResponse = {
      ...req.chasm.chatResponse,
      ...(i > 0 && req.chasm.attachments[i] ? { attachments: req.chasm.attachments[i] } : {})
    };
    const newPromise = axios({
      method: 'post',
      url: this.serviceUri,
      data: chatResponse
    });
    axiosArray.push(newPromise);
  }

  return Promise.all(axiosArray);
}

原代码出问题的本质

当你写let chatResponse = req.chasm.chatResponse;时,并没有创建新对象,只是把chatResponse变量指向了原对象的内存地址。循环中每次修改chatResponse.attachments,都是在修改同一个原对象的属性。当所有Axios请求最终执行时,这个对象已经被循环的最后一次迭代修改成了最后一项的attachments,所以所有请求都发送了最后一项的数据。

内容的提问来源于stack exchange,提问作者caelon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:22:17