【发布时间】:2021-11-13 02:09:14
【问题描述】:
我的情况如下:我正在执行顺序 HTTP 请求,其中一个 HTTP 请求依赖于前一个的响应。我想将所有这些 HTTP 请求的响应数据合并到一个 observable 中。在使用异步生成器之前,我已经实现了这一点。这个代码比较简单:
async function* AsyncGeneratorVersion() {
let moreItems = true; // whether there is a next page
let lastAssetId: string | undefined = undefined; // used for pagination
while (moreItems) {
// fetch current batch (this performs the HTTP request)
const batch = await this.getBatch(/* arguments */, lastAssetId);
moreItems = batch.more_items;
lastAssetId = batch.last_assetid;
yield* batch.getSteamItemsWithDescription();
}
}
我正在尝试远离异步生成器,而转向 RxJs Observables。我最好的(和工作的)尝试如下:
const observerVersion = new Observable<SteamItem>((subscriber) => {
(async () => {
let moreItems = true;
let lastAssetId: string | undefined = undefined;
while (moreItems) {
// fetch current batch (this performs the HTTP request)
const batch = await this.getBatch(/* arguments */, lastAssetId);
moreItems = batch.more_items;
lastAssetId = batch.last_assetid;
const items = batch.getSteamItemsWithDescription();
for (const item of items) subscriber.next(item);
}
subscriber.complete();
})();
});
现在,我相信一定有一些方法可以改进这个 Observer 变体 - 这段代码对我来说似乎不是很被动。我使用pipe 尝试了几件事,但不幸的是这些都没有成功。
我发现concatMap 接近解决方案。这让我可以将下一个 HTTP 请求连接为可观察的(使用 this.getBatch 方法完成),但是我找不到不放弃当前 HTTP 请求响应的好方法。
如何做到这一点?简而言之,我相信这个问题可以描述为将数据附加到可观察对象本身内部的可观察对象。 (但也许这不是处理这种情况的好方法)
【问题讨论】: