javascript同步和异步处理数组的几种方法

用函数依次处理数组中的每一项是一个常见的需求。

当需要同步的函数处理时通常会写出下面的代码:

var i = 0,length = arr.length;
for( ;i<length; i++){
    asny(arr[i]);
}
//All array items has been processed!

当函数是异步的时候上面的方法就不能保证循环结束后所有的数组成员都已近处理完毕。如果数组成员需要一个一个的并行的处理一般需要下面的处理方法。

(function next(i,length,callback){
    if(i<length){
        asny(arr[i],function(value){
            arr[i] = value;
            next(i++,length,callnack)
        });
    }else{
        callback();
   }
})(0,arr.length,function(){
    //all array items has been processed!
});

可以看到,以上代码在异步函数执行一次并返回执行结果后才传入下一个数组成员并开始下一轮执行,直到所有数组成员处理完毕后,通过回调的方式触发后续代码的执行。如果数组成员可以并行处理,但后续代码仍然需要所有数组成员处理完毕后才能执行的话,则异步代码会调整成以下形式:

(function(i,length,count,callback){
    for(;i<length;i++){
        (function(i){
            asny(i,function(value){
                arr[i] = value;
                if(++count == length)  callback();
            })
        })(i)  
   }  
})(0,arr.length,0,function(){
    //all array items has been processed!
})

可以看到,与异步串行遍历的版本相比,以上代码并行处理所有数组成员,并通过计数器变量来判断什么时候所有数组成员都处理完毕了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍...
    呼呼哥阅读 1,090评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,315评论 25 708
  • 烟花三月,桃花灼灼。 沈府的桃花是整个京城出了名的。每年三月,正是沈府别院里那桃林盛开的季节,烟烟霞霞,争艳斗奇,...
    阿粥uu阅读 917评论 2 4
  • 彭小六这个名字,在我加入行动派本地组织之后突然熟悉起来,因为群里都是他的铁粉。他的两本书——《让未来现在就来》《颠...
    Elaine_guoguo阅读 217评论 2 3