首页 > 解决方案 > RxJS 从发出的 observable 中获取值

问题描述

我有两个可观察的,searchText并且offset. 当用户在文本框中输入某些条件时,搜索文本会发出一个值,而当用户无限滚动滚动结果时,会发出偏移量。

我在这里尝试做的是将 my 设置infiniteSiteList为实际发出该值的 observable 的结果。例如,如果用户只是滚动,并且无限滚动中有更多结果,infiniteSiteList则应设置为 的输出batchMap,但是,如果用户正在输入一些文本进行搜索,infiniteSiteList则应设置为 的输出searchMap。我在想race是正确的运算符,但是,它似乎只需要 batchMap 的第一个值,所以它破坏了滚动行为。我可以用来执行此操作的 RxJS 运算符是什么?

const searchMap = this.searchText.pipe(
    throttleTime(500),
    mergeMap(searchText => this.getBatch(null, searchText))
);

const batchMap = this.offset.pipe(
    throttleTime(500),
    mergeMap(n => this.getBatch(n, this.searchText.getValue())),
    scan((acc, batch) => {
        return [...acc, ...batch];
    }, new Array<SiteListItem>())
);

this.infiniteSiteList = race([searchMap, batchMap]).pipe(
    tap(data => console.log(data))
);

标签: angularrxjs

解决方案


race将首先检查哪个可观察对象发出,然后只从该可观察对象中获取值。

这完全取决于您希望如何在infiniteSiteList. 如果您希望能够无限期交换:

this.infiniteSiteList = merge(batchMap, searchMap);

如果你想从一个交换到另一个,但又不想再回来,那么只需添加一个takeUntil.

const batchMap = this.offset.pipe(
   ...,
   takeUntil(searchMap)
);

this.infiniteSiteList = merge(batchMap, searchMap);

推荐阅读