【问题标题】:RxJS: Conditionally repeat AJAX with reponse from previous resultRxJS:有条件地重复 AJAX 并响应先前结果
【发布时间】:2019-01-24 13:13:50
【问题描述】:

我们有一个 API 会以布尔值 hasMoretoken 进行响应。如果hasMoretrue,我们可以使用token 进行另一个API 调用来获得下一组结果。这个过程需要重复直到hasMorefalse。然后,整个结果列表需要作为一个列表发出,并且 observable 需要完成。

我已经设法使用 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() 返回一个可观察对象,它使用提供的令牌执行 API 调用,并将 API 响应正文作为 JSON 发出)

https://rxviz.com/v/7J245RDo

但是,我想知道是否有一种纯粹的可观察方式来执行此操作,而无需使用 BehaviorSubject。我尝试使用 repeatWhen,但不知道如何更改输入数据,以及映射到响应数据。

【问题讨论】:

    标签: rxjs


    【解决方案1】:

    您要查找的内容称为expand() 运算符。基本上,它允许您根据接收到的输入进行递归

    doRequest()
      .expand((resultPage) => resultPage.hasMore ? doRequest(resultPage.token) : Observable.empty())
      .subscribe((page) => console.log(page));
    

    每页结果都通过 expand() 运算符发送到您的订阅。在展开中,如果需要,您可以递归到下一页,或者返回一个空的 observable 来表示递归结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2018-11-29
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多