【Js】axios批量请求指南

2,039 阅读1分钟

在做个人项目的时候出现了一个很奇怪的问题:当你使用axios想要批量发送请求的时候,请求到的数据需要存入到数组,最后会发现怎么debug数组中都没有数据。

一、axios请求

封装好的axios的post请求

//post请求
export const post = (url, data, config = {}) => {
    return new Promise((resolve, reject) => {
      instance({
        method: 'post',
        url,
        data,
        ...config
      }).then(response => {
        resolve(response)
      }).catch(error => {
        reject(error)
      })
    })
  }

二、错误示范

首先,主观的去使用for循环在循环体中使用axios去发送请求,将response返回的参数赋值给变量,然后存入数组中。

const data= ref({
		code:['1','2','3'],
		array:[]
})
//随便写个方法
const method = () =>{
    for(var i=0;i<data.value.code.length;i++){
	//发送post请求
	post(data.value.code[i]).then(res=>{
            data.value.array.push(res.data);
	}
    }
    console.log(data.value.array);
}

最后在控制台显示的信息是undefined,看到了就很气,找了半天也没发现东西跑哪去了。

三、正确做法

原因在于,按照我的理解,axios执行的是异步请求。异步请求不会实时的去执行then的内部语句(可能就被忽略了)。因此我们需要使用同步的方法,且把赋值的语句写到请求体外。(不知道是不是因为我写到循环体内了,下次调查看看)。

const data= ref({
		code:['1','2','3'],
		array:[]
})
//随便写个方法
const method = async () =>{
    for(var i=0;i<data.value.code.length;i++){
        //发送post请求
        var res= await post(data.value.code[i]).then(res=>{
                    return res.data;
	}
	data.value.array.push(res);
    }
    console.log(data.value.array);
}

这样就可以解决问题了,理解起来其实不难。

四、补充一个axios的官方并发使用

自己手动实现这个效果还是有点土的,改用axios的方法实现比较优雅。

// 创建一个请求地址数组
let arr = []
// 批量请求,批量进行结果处理
axios.all(arr).then(axios.spread(function (...data){
    for(let value of data){
        ...
    }
    successCallback()
}));