在开发中遇到连续上传图片视频,或者预加载图片等情况,我们就要用到并发限制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body></body>
</html>
<script>
//异步promise
function sleep(delay,msg ) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(msg);
resolve();
}, delay);
});
}
//请求列表
const tasks = [
() => sleep(1000, "起床啦"),
()=>{
console.log("中间上厕所一次")
console.log("中间上厕所二次")
},
() => sleep(2000, "吃早餐啦"),
() => sleep(3000, "打游戏啦"),
() => sleep(4000, "写代码"),
() => sleep(6000, "做运动啦"),
() => sleep(8000, "睡觉啦"),
];
//限制并发
async function doSomeThing(tasks, limit = 2) {
const taskPool = new Set();
for (const task of tasks) {
const promise = task();
p = Promise.resolve(promise) // 考虑到如果不是promise情况
taskPool.add(p);
p.then(() => taskPool.delete(p));
if (taskPool.size >= limit) {
await Promise.race(taskPool);
}
}
return Promise.all(taskPool)
}
doSomeThing(tasks).then(()=>{
console.log("endout!!!!")
})
</script>
每次触发两个请求, 等上面两个异步执行完毕再执行后两个依次循环到最后
![](https://img.haomeiwen.com/i18307239/8b2b8baf964c3062.png)
网友评论