迭代不确定的延迟项目数组

时间:2013-12-01 04:10:23

标签: javascript jquery asynchronous jquery-deferred

假设我有一个很长的列表,其中每个元素都需要异步调用fetch。我想在该列表的顶部编写一个API,以便消费者可以简单地调用“next()”或以其他方式同步迭代列表。

理想情况下,我会有类似的东西:

while ((foo = generator.next()) != null) {
  process(foo);
}

但是,我发现自己绊倒了延迟调用的语义,我不知道如何将这种硬编码模式转换为通用循环:

$.when(foo).then(process1AndFetch2)
  .then(process2AndFetch3)
  .then(process3AndFetch4)
  ...

据推测,我可以通过回调自己做到这一点

var callback = function() {
  process();
  fetch(callback);
}
fetch(callback);

然后我的筹码会变得非常深,这就是为什么我在推迟工作。

是否有将这种异步行为转变为同步API的常见嫌疑人?

1 个答案:

答案 0 :(得分:1)

你不能拥有这样的语法,因为它会进入无限繁忙的循环。

有一个共同的承诺成语:

var array = [process1AndFetch2, ...]

array.reduce(function(a, b) {
    return a.then(process).then(b);
}, array.shift()()).then(function(){
    //All processed
});

假设jQuery 1.8 +