2012-06-15 64 views
0

Stack上有很多这个问题的变体,大多数答案只是说重构代码或使用async = false。使用jQuery循环访问数据时调用异步函数

问题再次是,您想要循环访问一组数据,并在每个元素上制定一些异步函数,但不希望多个异步线程同时运行。这可能会像数组命令一样搞砸了,或者完全不同于你的项目想做的事情。

例如,

$.each(my_data,function(i,o){ 
    $.getJSON(o,function(r){ 
    //do somethin' with r then move on to next my_data element 
    }); 
}); 

回答

2

这里有一个小片段我用得到解决上述问题,单纯使用回调(不告诉JS挂)。它可能存在于其他地方,似乎足够方便已经存在,但我没有看到它。所以这里希望它能帮助你们中的一些人。

如果您希望我改进语法或优化它,请评论答案,我不是世界上最优雅的编码器。

function asyncloop(i,arr,each_cb,end_cb){ 
    var cont,s; 
    //just do a quick check to ensure this is an array or not at end 
    if ($.isArray(arr)) { 
      s = arr[i]; 
      if ((i+1) < arr.length) { cont = true; } else { cont = false; } 
    } else { 
     s= arr; 
     cont = false; 
    } 
    each_cb(s,function(){ 
     if (cont == true) { 
      asyncloop((i+1),arr,each_cb,end_cb); 
     } else { 
      end_cb(); 
     } 
    }); 
} 

呼叫使用 -

asyncloop(0,my_data,function(o,callback){ 
    //gets called with each element 
    some_asynch_function(o,function(r){ 
    //blah blah blah 
    callback(); 
    }); 
},function(){ 
    //finish with this 
    alert('process is finished wowowow'); 
}); 

干杯呢!