异步分块处理

js如果同步运行一段非常耗时的代码 就会冻结用户与页面的交互 耗时越久 等待时间越长

例如有下面代码

for(let i = 66666,s=‘‘,ar=[];i--;)
            ar.push(‘<miku></miku>‘);
        document.body.innerHTML=ar.join(‘‘);

这段代码就有很多问题  其中知道拼接字符串已经算好的了 有些更糟糕的代码 直接N次innerHTML 都不想吐槽了!

现代浏览器都能跑动上面代码的 如果我把666666(5个6)  改为666666(你说几个6 考你眼力)估计都要跪

而且不光是元素数量多的问题  innerHTML还拿不到句柄  不方便接下来的操作。

------------------------------------------------

如何分块处理数据呢? 其实就是把原先的N个数据 分成一小块一小块 当处理到一定量的时候再放入一个新的队列中 最终完成后就可以callback回去 整个过程是异步的

如下 对数组删除重复元素的代码

<h3 id="hh3"></h3>
    <input type="button" value="async" id="btn1"></button>
    <input type="button" value="sync" id="btn2"></button>
const raf = function(t){
            requestAnimationFrame(arguments.callee);
            hh3.innerHTML=t;
        }();

        const fn1 = function(fn){
            var i = 0;
            var l =ar.length;
            const f = Math.floor;
            const c = f(Math.sqrt(l));
            const r = f(l/c);
            const part = l-c*r;
            const st = new Set();

            const _ = ()=>{
                while(++i<r){
                    for(let j = 0;j<c;++j)st.add(ar[i*c+j]);
                    return setTimeout(_);
                }
                fn(st);
            };
            _();
            //var st = new Set();for(let i=ar.length*20;i--;) st.add(ar[i]||‘miku‘);
            //fn(st);
        };

        const ar = Array.from({length:3e5},v=>(Math.random()*10).toFixed(1));

        var fn2 = Function(‘ar‘,‘fn‘,function(s,fn1){
            return (fn1+‘‘).replace(/\/{2,}(.+)/g,(a,b)=>s+=b),s;
        }(‘‘,fn1));

        btn1.onclick = function(){
            this.disabled = true;
            fn1((st)=>{
                this.disabled = false;
                console.log([...st]);
            })
        }
        btn2.onclick = function(){
            this.disabled = true;
            fn2(ar,(st)=>{
                this.disabled = false;
                console.log([...st]);
            })
        }

点async 页面不会被阻塞住 只要等back结果就可以 但是你点sync明显会感觉整个页面顿了顿!

解释下代码

里面的去重算法O(n)复杂  是用的Set实现的 也可以用Map 低版本的的用hash可以实现基础的。

其中最关键的就是把需要分块的数据分解成了行列形式  内循环到达一定量时候开启新队列 。

这里行列并没有包括所有的数据 可能还有剩余的(可以再来个对剩余的遍历) 我就演示用的 请忽略。。

当处理的数据并不需要按顺序完成 而且数据量极大的时候  我们就应该用异步方式一块块处理 或者某些情况还可对ie10+开worker解决!

时间: 2024-10-25 14:42:20

异步分块处理的相关文章

Aliyun OSS SDK 异步分块上传导致应用异常退出

问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framework 2.0, unhandled exceptions, no matter where they come from, will cause termination of the app. (详见:Exceptions in Managed Threads:https://msdn.micros

线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程.对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦出现异常没有捕获,将会带来难以发现的bug,进而造成系统崩溃.而多线程本身也不是一朝一夕就能学好的,必须不断的去学习总结,所以我个人认为你要用一种线程模型,首先要对它有足够的了解,特别是对异常的捕获.如果你没有完全的把握,最好在实际开发中谨慎的用多线程. 1,APM异步编程模型. 采用BeginXX

asp.net core分块上传文件

写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...(省略一万字,不废话).这里我没用传统的asp.net,而选择了开源的asp.net core,原因很简单,.net core是.net新的开始,更是.net和.net开发者的未来,希望.net发展越来越好(大家的工资越来越高(●ˇ?ˇ●)). 1.前端的实现: 1).html: 1 <html> 2 <head> 3

【javascript】异步编年史,从“纯回调”到Promise

异步和分块——程序的分块执行 一开始学习javascript的时候, 我对异步的概念一脸懵逼, 因为当时百度了很多文章,但很多各种文章不负责任的把笼统的描述混杂在一起,让我对这个 JS中的重要概念难以理解, “异步是非阻塞的”, “Ajax执行是异步的”, "异步用来处理耗时操作"....  “可异步到底是什么?” 后来我发现,其实理解异步最主要的一点,就是记住: 我们的程序是分块执行的. 分成两块, 同步执行的凑一块, 异步执行的凑一块,搞完同步,再搞异步 废话不多说, 直接上图:

Xitrum学习笔记09 - 异步响应

Xitrum不会自动发送默认响应,必须调用respondXXX方法发送响应.如果没有调用respondXXX,Xitrum会保持HTTP连接,可以过后调用respondXXX. 调用 channel.isOpen 来检查 HTTP连接 是否还处于打开状态.还可以使用addConnectionClosedListener方法,定义连接关闭之后的动作. addConnectionClosedListener { // The connection has been closed // Unsubsc

net core分块上传文件

net core分块上传文件 写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...(省略一万字,不废话).这里我没用传统的asp.net,而选择了开源的asp.net core,原因很简单,.net core是.net新的开始,更是.net和.net开发者的未来,希望.net发展越来越好(大家的工资越来越高(●ˇ?ˇ●)). 1.前端的实现: 1).html: 1 <html> 2

【纯干货】4年前想解决的事情,今天才实验成功:浏览器原生分块上传文件

第一份软件开发工作的第一个星期(不算做试用期的一个星期,无薪水试用).因为不是软件专业,也没有经过培训和相关工作经验.老板不放心,但还是让我试一试.做的第一件事情就是上传文件,实时看进度,并且上传后预览.预览的文件类型有word,ppt,excel,flash,视频按帧获取预览图.office文件是在服务器端转成html后显示出来. 做的还满意,就留下来了,后来就在那个公司待了两年. 没解决的事情: 上传大文件,分块上传,浏览器原生不支持,需要借助第三方插件.最根本的原因就是浏览器端的js考虑的

HTTP_异步下载

//创建imageVIew对象 - (void)createImageView { UIImageView *imageView = [[UIImageView alloc]init]; //1 imageView.frame = CGRectMake(30, 120, 300, 400); imageView.backgroundColor = [UIColor redColor]; [self.view addSubview:imageView];//2 //[imageView relea

断点续传和分块上传

#pragma mark   异步上传 - (void)uploadObjectAsync:(NSString *)FileURL objectKey:(NSString *)objectKey{ OSSPutObjectRequest * put = [OSSPutObjectRequest new]; NSLog(@"objectKey is %@",objectKey); // required fields put.bucketName = bucketName; put.ob