使用 async await + setTimeout 分割 while 循环

由于JavaScript单线程的特性,在执行CPU密集型任务时(如大数组排序)会阻塞网页的渲染,解决办法一般是使用setTimeout函数对任务进行分割,或者把这类任务交由 web worker 处理。今天遇到一个对大数组排序的问题,需要使用任务分割来避免阻塞,在这里记录下我的实现方法。在实现时我将 while 语句进行了分割,避免出现大循环体语句一直进行计算,主要代码如下: // ...
摘要由CSDN通过智能技术生成

由于JavaScript单线程的特性,在执行CPU密集型任务时(如大数组排序)会阻塞网页的渲染,解决办法一般是使用setTimeout函数对任务进行分割,或者把这类任务交由 web worker 处理。今天遇到一个对大数组排序的问题,需要使用任务分割来避免阻塞,在这里记录下我的实现方法。在实现时我将 while 语句进行了分割,避免出现大循环体语句一直进行计算,主要代码如下:

    //while 控制语句进行分割
    // expression 相当于 while 的条件判断
    // statement 相当于 while 循环体语句
    async function while_async(expression, statement){
        while(expression()){
            await while_seg(expression, statement);
        }
    }

    let while_seg = (expression, statement) => new Promise((resolve, reject) => {
        setTimeout(()=>{
            let i = 0;
            let while_size = 50000;
            while(expression()){
                i++;
                statement();
                // 如果 while 内循环次数大于 while_size ,则进入事件循环
                if(i>while_size)break;
            }
            resolve();
        }, 0);
    });

应用在大数组排序上,效果对比可以在这里查看:https://codepen.io/liuyaqi/pen/dmZdPe

height="351" width="650" scrolling="no" title="while_seg" src="//codepen.io/liuyaqi/embed/dmZdPe/?height=351&theme-id=0&default-tab=result&embed-version=2" allowfullscreen="true">See the Pen <a href="https:
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值