逛到个小问题,记录一下,别往下看,自己写写先~~~
如题,12-28行是题目,要求写个执行函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button type="button" onclick="run()">开始</button>
</body>
<script>
/* 题目需求
* 1、待发起任务20个,并发限制最多5个(同一时间,最多可运行5个任务)
* 2、每个任务失败时,最多可重试2次
*/
function task (data) {
return new Promise((resolve, reject) => {
console.log('running', data, +new Date());
setTimeout(() => {
const ok = Math.round(Math.random() * 1000) % 2;
if (ok) {
resolve(ok);
} else {
reject(new Error('mock fail'));
}
}, 300);
});
}
//待运行的20个任务初始化
let preTask=[...new Array(20)].map((item,index)=>({name:index,repeat:0}))
/**
* 执行任务
* @author cuishoujia 2022-01-20
* @return {[type]} [description]
*/
function run(){
//首轮并发执行5个任务
[...new Array(5)].map( _ => handle() )
}
/**
* 任务调度
* @author cuishoujia 2022-01-20
* @return {[type]} [description]
*/
function handle(param){
if(preTask.length===0 || preTask.every(pt=>pt.repeat>2)) return false
let item= param || preTask.shift()
task(item.name).then(res=>{
console.log(item.name+"执行成功++++++++++")
handle()
}).catch(e=>{
item.repeat++
console.log(item.name+"执行失败++++++++++++++++"+item.repeat+"次+++++++++++")
handle(item.repeat>2 ? null : item)
})
}
</script>
</html>