RxJs:ConcatMap VS ConcatMapTo,MergeMap VS MergeMapTo

squ*_*uck 3 rxjs rxjs6

该文档不足以帮助我理解它们之间的区别。

就像concatMap,但始终将每个值映射到相同的内部Observable。 http://reactivex.io/rxjs/file/es6/operators/concatMapTo.js.html

我尝试查看关于stackblitz的learningrxjs.io的示例,但是即使有了这些示例,我也无法立即识别出区分这些特征的区别。

仅供参考,我看到了另一个类似的问题 ,mergeMap和mergeMapTo有什么区别? 但是那里的答案并不令人满意,因为在learnerxjs.io示例中,它们显然映射到可观察对象,而不是硬编码值。 https://www.learnrxjs.io/operators/transformation/concatmapto.html

如果有人可以提供一些示例(也许是简短的解释)来帮助区分***与***,以区分高阶可观察算子,谢谢,谢谢。

mar*_*tin 6

简而言之,带有的 变量*To将始终使用创建整个链时需要创建的相同Observable,而与链发出的值无关。它们将Observable作为参数。

没有的 变量*To只能在其源Observable发出时创建并返回任何Observable。他们将回调作为参数。

例如,当我使用时,mergeMapTo我总是订阅相同的Observable:

source.pipe(
  mergeMapTo(of(1)),
)
Run Code Online (Sandbox Code Playgroud)

来自的每个发射source都将始终被映射到,of(1)并且我无法更改它。

另一方面,mergeMap我可以根据接收到的值返回我想要的任何Observable:

source.pipe(
  mergeMap(v => of(v * 2)),
)
Run Code Online (Sandbox Code Playgroud)

考虑这一点的一种更简单的方法可能是记住,*To变体将值映射到常数(即使它不是“真正的JavaScript常数”)。

  • 谢谢!我花了一段时间才明白你的答案,但现在我明白了。*To 将 observable 作为直接参数,而没有 *To 后缀的将函数作为直接参数(并且该函数可以根据给定的条件逻辑有条件地返回各种不同的 observable)。 (2认同)