RxJs Observable并行发出请求,直到失败

时间:2018-11-22 16:21:24

标签: javascript node.js typescript rxjs observer-pattern

我想找到一个API,该API以50个项目的页面返回数据,但是我不知道有多少个项目(因此还有页面)。

我的想法是并行发送20个请求,每个请求都将请求ith页面,然后是ith + 20页面,依此类推,直到页面返回空白为止,在这种情况下,我结束。

通过这种方法,我最多可以执行20个不必要的请求。

问题是,我不知道如何使用可观察对象来构造此循环。

我想像这样:

return Observable.from(_.range(0, 20))
  .map((pageNo) => fetchPage(pageNo))
  .while((page) => isValid(page));

但是这种while方法或类似方法不存在/有效

我发现了类似的问题,但他使用了interval,似乎效率不高RxJs Observable interval until reached desired value

据我了解,我无法使用takeWhile,因为它可以验证已经满足的条件,并且无法响应仍在进行的请求。

2 个答案:

答案 0 :(得分:1)

这可能有帮助

return Observable.from(_.range(0, 20)).pipe(
    mergeMap(pageNo => ajax.getJSON(`/api/fetchPage/${pageNo}`).pipe(
        mergeMap(result => 
            of(addPersonFulfilled(result), secondFunc(foo)),
            retryWhen(error => tap(console.log('error on page', error)))
        )           
    ))
)

答案 1 :(得分:1)

您可以创建20个请求,并等待所有请求以forkJoin完成,然后在结果数组为空时使用takeWhile完成该链:

const fetchPage = page => {
  ...
  return forkJoin(...);
};

range(0, 20).pipe(
  concatMap(page => fetchPage(page)),
  takeWhile(arr => arr.length > 0),
)
.subscribe(console.log);

完整的演示:https://stackblitz.com/edit/rxjs-zw1sr2?devtoolsheight=60