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

多次调用异步函数时传入上一次执行返回结果作为参数的实现方案

问题原因分析
  • 未做异步串行控制:axios.get是异步操作,原始代码的for循环不会等待上一个请求返回就执行下一轮迭代,执行array[1]对应的请求时,callResponse[0]还没有被赋值,自然拿不到正确的入参。
  • 变量作用域错误:用var声明的迭代变量i没有块级作用域,所有请求的then回调触发时,拿到的i都是循环结束后的最终值,会导致callResponse的赋值下标完全错乱。
解决方案

方案1:async/await 串行执行(最直观易维护)

const array = [/* 你的数组原始内容 */]
const callResponse = new Array(array.length - 1)

async function serialRequest() {
  // 用let声明迭代变量,自带块级作用域
  for (let i = 0; i < array.length; i++) {
    const body = {
      parameter1: array[i],
      parameter2: i === 0 ? '' : callResponse[i-1]
    }
    // 等待当前请求返回后再执行下一轮循环
    const response = await axios.get('', body)
    if (i < array.length - 1) {
      callResponse[i] = response.data.x
    }
  }
  // 全部执行完成后可以在这里处理callResponse
  console.log('全部请求执行完毕', callResponse)
}

// 执行请求,可根据需要添加try/catch捕获异常
serialRequest().catch(err => console.error('请求出错:', err))

方案2:Promise 链式调用(兼容旧版本运行环境)

如果你的运行环境不支持async/await,可以用Promise链式调用实现相同效果:

const array = [/* 你的数组原始内容 */]
const callResponse = new Array(array.length - 1)

// 初始化已完成的Promise作为链式调用起点
let requestChain = Promise.resolve()
for (let i = 0; i < array.length; i++) {
  // 每一轮请求追加到调用链末尾
  requestChain = requestChain.then(() => {
    const body = {
      parameter1: array[i],
      parameter2: i === 0 ? '' : callResponse[i-1]
    }
    return axios.get('', body).then(response => {
      if (i < array.length - 1) {
        callResponse[i] = response.data.x
      }
    })
  })
}

// 所有请求完成后的回调
requestChain.then(() => {
  console.log('全部请求执行完毕', callResponse)
}).catch(err => console.error('请求出错:', err))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:18:02