angular - 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))
);
解决方案
race
将首先检查哪个可观察对象发出,然后只从该可观察对象中获取值。
这完全取决于您希望如何在infiniteSiteList
. 如果您希望能够无限期交换:
this.infiniteSiteList = merge(batchMap, searchMap);
如果你想从一个交换到另一个,但又不想再回来,那么只需添加一个takeUntil
.
const batchMap = this.offset.pipe(
...,
takeUntil(searchMap)
);
this.infiniteSiteList = merge(batchMap, searchMap);
推荐阅读
- javascript - 如何使用 JSON 使具有多个角色的成员静音?
- google-sheets - 如何按字母顺序对一组单元格进行排序 - Google 表格
- angularjs - 使用angularjs运行业力单元测试时如何解决“无法在模块外使用导入语句”?
- google-cloud-platform - 缺少 IAM 和管理菜单选项
- docker - EC2 中的 Docker 容器无法通过 AWS SDK 将数据写入 AWS S3
- javascript - 如何在 node.js 中的特定持续时间后强制解决承诺?
- excel - 从单个列中复制多个值
- python - 字段 'id' 需要一个数字 - 将 ForeignKey 上传到 django-import-export
- base-url - Google Photos REST API“BASE_URL=dv”返回“302 Moved”错误
- unity3d - Unity 错误:X 服务器响应时间超过 2002 毫秒