- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我一直没能找到这个问题的答案,但是 concat map 之间有什么区别?和 map ?具体来说,我有一个让我很困惑的例子:
const domainsObservable = this.auth.getAuthDomains()
.shareReplay()
.concatMap((authDomains) => authDomains.map((domain) => this.toDomain(domain, connectionsObservable)))
.filter((authDomain) => this.isValidDomain(authDomain))
.toArray();
这是从服务 getAuthDomains()
调用一个方法,该方法刚刚返回一个包含 3 个域的数组。当我使用上面的实现时,我最终得到了一个包含 4 个数组的数组,每个数组都有一个包含 3 个域的数组。不知何故,它使响应中的数据量翻了两番。
然后我切换到以下实现:
const domainsObservable = this.auth.getAuthDomains()
.shareReplay()
.map(authDomains => authDomains.map(domain => this.toDomain(domain, connectionsObservable)))
.map(authDomains => authDomains.filter(domain => this.isValidDomain(domain)));
这正是我所需要的——一个被正确过滤的数组。
那么为什么切换到 map
会显着改变结果?我的操作顺序重要吗?
谢谢
最佳答案
简单的说两个操作符做了以下事情:
map()
- 将每个值转换到一个不同的值中,该值在链中传播得更远:
.map(v => v * 2)
这与Array.map()
基本相同.
concatMap()
- 将每个值转换到一个 Observable 中并订阅它。运算符总是只订阅一个内部 Observable,所以如果源 Observable 发射值更快,它们就会被缓冲在 concatMap()
中。 :
.concatMap(v => Observable.of(v * 2))
...或者通常在 Angular 中你会做这样的事情:
.concatMap(v => this.http.get(`whatever/${v}`))
但是有趣的部分来了。在订阅内部 Observables(从投影函数等返回的 Observables)的 RxJS 5 操作符中,实际上期望所谓的“可观察输入”。这意味着您可以自由交换 Observables、Promises、类似 Observables 的对象……以及 JavaScript 数组。
在内部它是使用 subscribeToResult
实现的功能。请注意,如果您向它传递一个数组,它会迭代它并分别发出每个值:https://github.com/ReactiveX/rxjs/blob/master/src/internal/util/subscribeToResult.ts#L17
这意味着您可以使用 concatMap()
将数组“解包”为单个发射。例如:
Observable.of(42)
.concatMap(v => [1, 2, 3])
.subscribe(console.log)
这将打印数字:
1
2
3
另一方面,如果您只使用 map
它只会进一步传递数组:
Observable.of(42)
.map(v => [1, 2, 3])
.subscribe(console.log)
这将打印数字:
[1,2,3]
所以 concatMap
有时仅用于解压缩来自源 Observable 的数组 concatMap(array => array)
这正是您的代码中发生的事情。
哪个更好,就看你自己了。通常执行像 map
这样的简单操作会更容易。或 filter
出于性能原因,在 Array 对象本身上而不是在 Rx 链中解包和处理。
关于javascript - 映射 vs concatMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471872/
是否可以并行执行高阶可观察对象,但在合并结果时仍保留顺序? 我有这样的东西: invoker$: Observable; fetch: (index: number) => Observable; i
我有这个设置: public listenCampaignSelected(){ var campaignSelected$ = this.store .select(store => s
这个问题在这里已经有了答案: Difference between concatMap f xs and concat $ map f xs? (1 个回答) 7年前关闭。 concatMap 是什么
我正在处理一组文件。对于每个文件,我需要请求正确的上传 URL,然后将该文件上传到正确的端点。 concatMap应该仅在前一个值完成后发出。这样,文件就应该被顺序处理。 这是我的代码: filesC
问题 7 来自 99 个 Haskell 问题 展平嵌套列表结构 这是我的解决方案: data NestedList a = Elem a | List [NestedList a] myFlatte
我有一个 37MB bin 文件,我正在尝试将其转换为 ppm 序列。它工作正常,我正在尝试将其用作练习来学习一些分析以及有关 Haskell 中惰性字节串的更多信息。我的程序似乎在 concatMa
我有以下代码: Observable.from(modifiedNodes) .concatMap(node => { return this.Model.setData(no
这个问题已经有答案了: Replace a 3 parameter list-comprehension by using map, concat (3 个回答) 已关闭 3 年前。 如何将列表理解转
我总体上很困惑,并正在寻找关于此代码如何工作的非常详细和解释性的答案: let xs = [1] ++ concatMap (\x -> [x+1,x*10]) xs in xs concatMap
这个问题已经有答案了: Replace a 3 parameter list-comprehension by using map, concat (3 个回答) 已关闭 3 年前。 如何将列表理解转
我在玩>>=今天,试图了解monads,发现了一个有趣的模式。使用列表单子(monad)时,>>=似乎表现得像 concatMap。我四处搜寻,试图找到任何相似之处,特别是在 hackage 的定义中
我试图找到一个行为类似于 concatMap 的运算符,但会丢弃介于两者之间的所有内容。例如, concatMap 执行以下操作: next a start handling a next b nex
可能是一个基本问题,但我有一个 Angular 应用程序调用后端服务来检索一些数据,然后使用该数据进行另一个后端服务调用。 第二次服务调用依赖于第一次成功完成,所以我使用 RxJS 的 concatM
我一直没能找到这个问题的答案,但是 concat map 之间有什么区别?和 map ?具体来说,我有一个让我很困惑的例子: const domainsObservable = this.auth.g
在Stream中我们可以通过flatMap将多维数据打开降维,扁平化处理数据为一维数据。Reactor当然也有这种需求,我们可以使用flatMap和concatMap进行数据的降维处理 flatMap
我读自Foldr Foldl Foldl'由于严格属性,foldl' 对于长的有限列表更有效。我知道它不适合无限列表。 因此,我只对长的有限列表进行比较。 连接映射 concatMap是使用 fold
考虑这个例子:我有一个文件按顺序下载。如果一个下载失败,它应该移动到下一个。伪代码: Observable.from(urls) .concatMap(url -> downloadObservab
我有一个 Observable 链和一个对话框,在一切都完成后会消失。顺序是这样的:1 api调用获取ResponseBody2 取response body进程(非ui线程)3个其他进程(不是ui线
我有 2 个 retrofit 电话需要进行 A 和 B: (A):返回一个ArrayList (B):获取 (A) 的结果,它是一个 ArrayList。 (B) 遍历 ArrayList 并使用每
我用 concatMap以长时间运行的操作一次处理一个项目流。在某些时候,我需要“中断”这个长时间运行的操作,但仅限于当前项目: @Test public void main() throws Int
我是一名优秀的程序员,十分优秀!