我有一个相当笨重的代码集,其中一个observable的数据被输入另一个,如:
let source = this.myService.getFoo()
.subscribe(result => {
let source2 = this.myService.getMoo(result)
.subscribe(result2 => { // do stuff });
});
我知道有很多方法可以组合和链接,但我需要从源代码中获取数据并将其输入source2。订阅的嵌套看起来很糟糕,我很确定有更好的方法来做到这一点。
谢谢!
答案 0 :(得分:13)
为了将Observable发出的项转换为另一个Observable,您可能希望使用flatMap运算符。它创建一个内部Observable并将其结果平移到外部流。
fputc()
以下是一些您可以使用的平面运算符,其行为方式不同:
答案 1 :(得分:2)
您可以使用merge
来"合并"这两个流可以将任何两个观测者的任何发射物发送给观察者:
let source = this.myService.getFoo()
.merge(this.myService.getMoo(result))
.subscribe(...);
...或者如果您只想在第一个Observable发出一个值之后订阅第二个Observable,您可以使用mergeMapTo
:
let source = this.myService.getFoo()
.mergeMapTo(this.myService.getMoo(result))
.subscribe(...);
你可以用concatMap
做类似的事情,等到内部的Observable竞争。
然而,这实际上取决于你想要达到的目标以及你希望在观察者中得到什么。