angular - 带有商店选择器的 concatMap 与 mergeMap
问题描述
我花了很多时间学习mergeMap和concatMap之间的差异,以清楚地理解差异,现在我很清楚了。我在其他网站上使用了很好的资源,例如https://rxjs-dev.firebaseapp.com和https://www.learnrxjs.io 。
这两个运算符都保留传入的源并订阅所有发出的具有不同顺序的值。但是在我的项目中,我遇到了一种情况,使用mergeMap和concatMap与我有很大不同,我想了解原因。
这是一个代码示例:
const Stream$ = from(requiredDocs.documents_type)
.pipe(
mergeMap(docID => this._store.select(selectDocumentTypeByID(docID))),
scan((acc: Array<DocumentType | undefined>, curr) => {
console.log('curr - ', curr)
acc.push(curr)
return acc
}, [])
).subscribe(val => console.log(val))
说明:我从数组requiredDocs.documents_type生成源,然后使用发出的值从使用选择器的商店中选择 - selectDocumentTypeByID(id: number)。后者是一个简单的 Array.find 函数,它返回未定义或找到的对象。然后我使用scan rxjs 运算符从选择器生成结果数组
预期结果: [ {obj}, {obj}, {obj} ] - select observable 返回的三个对象
mergeMap - result is as expected - [ {obj}, {obj}, {obj} ]
concatMap - result is just one obj(*first one*) - [ {obj} ]
如果我将商店选择器更改为 simple of(docID) rxjs 运算符,它会按预期工作。
为什么 concatMap 在与 store selector 一起使用时只返回一个 obj ?
解决方案
是的,提问的魔法很有效,除了这次有很多痛苦和思考:) 答案在 concatMap 定义中。该操作符订阅每个外部源 Observable 并且仅在上一个已完成时订阅后续
有趣的是,我的脑海里突然出现了一个问题,有点随机:) 经过几个小时的思考。因此,为了让我的示例正常工作,我需要完成 store.selector。我还不知道该怎么做,但对我来说,这两个歌剧之间的区别现在很清楚,这是一件重要的事情。
反过来,mergeMap 不会等待源 Observable 完成,这就是它按我需要工作的原因。祝大家好运:)
推荐阅读
- c# - 创建“然后我向下滚动 (x,y)”场景 Visual Studio Selenium Specflow
- javascript - 获取id数组中所有匹配id的元素
- shell - 将 sed 的输出插入到模式之间的另一个文件中
- neo4j - 当我需要笛卡尔积来创建合并节点时,如何替换它们?
- python - 虽然循环不起作用 - 文本冒险 python 游戏
- python - 你如何计算带有预付款的 numpy 的贷款摊销?
- cypress - 赛普拉斯为 API 调用添加延迟
- angular - 为什么 Angular 为 HttpClient 使用 Observable?
- zlib - 错误:未在此范围内声明“gzoffset”
- sorting - 根据设置对具有多个闭包之一的向量进行排序