0

Stack上有很多这个问题的变体,大多数答案只是说要重组你的代码或使用async = false。

问题又是,你有一个数据数组,你想要循环遍历并在每个元素上执行一些异步函数,但你不希望同时运行多个异步线程。这可能会弄乱数组顺序之类的事情,或者与您的项目想要做的完全不一致。

例如,

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

1 回答 1

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');
});

那就干杯!

于 2012-06-15T10:58:50.867 回答