Iterate over indefinite array of deferred items

2020-02-13 06:42发布

Say I have a very long list where each element requires an asynchronous call to fetch. I would like to write an API on top of that list so that a consumer can simply call "next()" or otherwise synchronously iterate over the list.

Ideally I would have something that looks like this:

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

But, I find myself tripping over the semantics of deferred calls, and I don't know how to escape this hard-coded pattern into a generic loop:

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

Presumably, I could do this myself with callbacks

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

But then my stack would get very deep, which is why I was working deferreds.

Are there any usual suspects for turning this kind of asynchronous behavior into a synchronous API?

1条回答
祖国的老花朵
2楼-- · 2020-02-13 07:05

You can't have such syntax because it would just go into infinite busy loop.

There is a common promise idiom to do this:

var array = [process1AndFetch2, ...]

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

Assumes jQuery 1.8+

查看更多
登录 后发表回答