我想找到一个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
,因为它可以验证已经满足的条件,并且无法响应仍在进行的请求。
答案 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