代码之家  ›  专栏  ›  技术社区  ›  Bart van den Burg

RXJS:有条件地重复Ajax,并从以前的结果进行响应

  •  0
  • Bart van den Burg  · 技术社区  · 7 年前

    我们有一个将用布尔值响应的API hasMore 和A token . 如果 哈斯莫尔 是 true ,我们可以使用它执行另一个API调用。 令牌 获取下一组结果。此过程需要重复,直到 哈斯莫尔 是 false . 然后,整个结果列表需要作为一个单独的列表发出,并且需要完成可观测的列表。

    我已经设法使用一个行为主题来实现这一点:

    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() 返回一个Observable,该Observable使用提供的令牌执行API调用,并将API响应主体作为JSON发出)

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mark van Straten    7 年前

    你要找的是 expand() 操作员。基本上,它允许您根据收到的输入递归

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

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