RxJS:有条件地重复AJAX,并根据前面的结果进行响应

RxJS:有条件地重复AJAX,并根据前面的结果进行响应,rxjs,Rxjs,我们有一个API,它将响应一个布尔值hasMore和一个token。如果hasMore为true,我们可以使用该token执行另一个API调用,以获得下一组结果。需要重复此过程,直到hasMore为false。然后,需要将整个结果列表作为单个列表发出,并且需要完成可观察列表 我已经通过一个BehaviorSubject实现了这一点: function getAll() { const subject = new BehaviorSubject(undefined); const obs

我们有一个API,它将响应一个布尔值
hasMore
和一个
token
。如果
hasMore
true
,我们可以使用该
token
执行另一个API调用,以获得下一组结果。需要重复此过程,直到
hasMore
false
。然后,需要将整个结果列表作为单个列表发出,并且需要完成可观察列表

我已经通过一个BehaviorSubject实现了这一点:

function getAll() {
  const subject = new BehaviorSubject(undefined);

  const obs = subject
    .asObservable()
    .pipe(
      flatMap(token => getRes(token)
        .pipe(
          tap(result => result.hasMore ? subject.next(result.token) : subject.complete())
        )
      ),
      map(result => result.items),
      reduce((acc, items) => acc.concat(items), [])
    );

  return obs;
}
(其中
getRes()


然而,我想知道是否有一种纯粹的可观察的方式来做到这一点,而不使用行为主体。我试着使用repeatWhen,但不知道如何更改输入数据,却映射到响应数据。

您要查找的是运算符。基本上,它允许您根据接收到的输入进行递归

doRequest()
  .expand((resultPage) => resultPage.hasMore ? doRequest(resultPage.token) : Observable.empty())
  .subscribe((page) => console.log(page));
每一页结果都通过expand()操作符发送到订阅。在expand中,如果需要,您可以递归到下一页,或者返回一个空的observable来表示递归结束