我需要用axios请求API接口,我有100个请求,但是每次的请求量要控制在最大6,当正在请求的6个请求当中某一个返回了结果,那么再添加后面的请求,假设这个请求地址是https:www.baidu.com/api/a,直到100个请求全部结果回来时,一次性发把100个请求结果给抛出
时间: 2024-04-06 11:30:21 浏览: 54
这是一个典型的并发控制问题,可以使用Promise和async/await来实现。
首先,你需要将所有的请求地址存储在一个数组中,然后按照顺序遍历数组,每次取出前6个地址进行请求,等到其中一个请求返回结果后,再将下一个地址加入请求队列中。这样可以保证同时最多只有6个请求在进行。
在请求过程中,我们可以使用Promise.race()方法来实现等待最快返回结果的功能。具体实现如下:
```javascript
const axios = require('axios');
async function fetchData(urlList) {
let result = [];
let currentIndex = 0;
while (currentIndex < urlList.length) {
let requests = [];
// 取出前6个地址进行请求
for (let i = currentIndex; i < Math.min(currentIndex + 6, urlList.length); i++) {
requests.push(axios.get(urlList[i]));
}
// 等待其中一个请求返回结果
let res = await Promise.race(requests);
let index = requests.indexOf(res);
// 将返回结果加入结果数组
result = result.concat(requests.splice(index, 1)[0].data);
// 将下一个地址加入请求队列中
currentIndex++;
}
return result;
}
// 测试
let urlList = [];
for (let i = 0; i < 100; i++) {
urlList.push(`https://www.baidu.com/api/a?id=${i}`);
}
fetchData(urlList).then(res => console.log(res));
```
这段代码中,我们使用了一个while循环来遍历所有的请求地址。每次循环,我们取出前6个地址进行请求,然后使用Promise.race()方法等待其中一个请求返回结果。当有请求返回结果后,我们将其加入结果数组中,同时将下一个地址加入请求队列中。当所有请求都完成后,我们将结果数组返回。
阅读全文