多次调用异步函数时传入上一次执行返回结果作为参数的实现方案
问题原因分析
- 未做异步串行控制:
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
相关产品推荐
相关产品推荐

