【问题标题】:Iterate over indefinite array of deferred items迭代无限的延迟项目数组
【发布时间】:2013-12-17 00:01:17
【问题描述】:

假设我有一个很长的列表,其中每个元素都需要异步调用来获取。我想在该列表之上编写一个 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 的常见嫌疑人?

【问题讨论】:

  • 看看here。这个问题的措辞不同,但我的回答应该会给你一些关于如何动态构建.then() 链的有力线索。

标签: javascript jquery asynchronous jquery-deferred


【解决方案1】:

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

有一个常见的 promise 习惯用法来做到这一点:

var array = [process1AndFetch2, ...]

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

假设 jQuery 1.8+

【讨论】:

猜你喜欢
  • 2016-09-19
  • 2011-07-16
  • 2016-05-17
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
相关资源
最近更新 更多