【发布时间】:2019-01-24 13:13:50
【问题描述】:
我们有一个 API 会以布尔值 hasMore 和 token 进行响应。如果hasMore 是true,我们可以使用token 进行另一个API 调用来获得下一组结果。这个过程需要重复直到hasMore 是false。然后,整个结果列表需要作为一个列表发出,并且 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 发出)
但是,我想知道是否有一种纯粹的可观察方式来执行此操作,而无需使用 BehaviorSubject。我尝试使用 repeatWhen,但不知道如何更改输入数据,以及映射到响应数据。
【问题讨论】:
标签: rxjs