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