待发起任务20个,并发限制最多5个,每个任务失败后,最多可重试2次

逛到个小问题,记录一下,别往下看,自己写写先~~~

如题,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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值