可以参考以下html代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum=1.0,minimum=1.0,user-scalable=0" />
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/axios-0.18.js"></script>
<script type="text/javascript">
async function asyncPool(poolLimit, array, iteratorFn) {
const ret = []; // 存储所有的异步任务
const executing = []; // 存储正在执行的异步任务
for (const item of array) {
// 调用iteratorFn函数创建异步任务
const p = Promise.resolve().then(() => iteratorFn(item, array));
ret.push(p); // 保存新的异步任务
// 当poolLimit值小于或等于总任务个数时,进行并发控制
if (poolLimit <= array.length) {
// 当任务完成后,从正在执行的任务数组中移除已完成的任务
const e = p.then(() => executing.splice(executing.indexOf(e), 1));
executing.push(e); // 保存正在执行的异步任务
if (executing.length >= poolLimit) {
await Promise.race(executing); // 等待较快的任务执行完成
}
}
}
return Promise.all(ret);
}
const fn=() => {
return axios({
method: 'get',
url: '/',
})
.then(function(response) {
return response.data;
});
}
const input=[];
for(let i=0;i<50;i++) {
input.push(fn);
}
const timeout= f => new Promise(resolve => setTimeout(() => resolve(f())));
asyncPool(5,input,timeout).then(res => {
console.log('res',res);
})
</script>
<style>
</style>
</head>
<body>
通过Promise来控制ajax的并发请求数
</body>
</html>
网友回复