我的用例场景如下:
我有一些可观察的链,有时我需要从Web服务中获取其他信息,并以解决的信息为基础,我想继续链或通过扔掉来停止它。
要等待来自服务的信息,我使用concatMap
(流中发出的每个值都映射到服务返回的新可观察值,我需要值,即值的可观察值)。为了平整所有内部可观测对象,将所有对象括在concatMap
以下代码效果很好:
/* Begin of chain */
.concatMap<Type, Type>((pld: Type) => {
return this.appService.getInfo()
.concatMap<string, Type>((info) => {
if (someFailingCondition(info)) {
Observable.throw(`Failed`);
}
/* Pass-through operation */
return Observable.of(pld);
});
})
/* Rest of chain */
但是我想放弃外部concatMap
来使用纯map
,以便仅从主链角度对纯值进行操作。我提供了concatAll
解决方案:
/* Begin of chain */
.map<Type, Type>((pld: Type) => {
return this.appService.getInfo()
.concatMap<string, Type>((info) => {
if (someFailingCondition(info)) {
Observable.throw(`Failed`);
}
/* Pass-through operation */
return Observable.of(pld);
})
.concatAll()
})
/* Rest of chain */
但是我想知道是否还有其他方法可以将concatMap
放入内部运算符系列中之后,再将内部可观测值系列重新放入平面值管道中?
答案 0 :(得分:1)
您的代码已经非常简单明了,有时不可能将所有可观察的东西平整地放在链中,您可以将其进一步简化为跟随它,实际上不需要concatAll
/* Begin of chain */
.concatMap<Type, Type>((pld: Type) => {
return this.appService.getInfo()
.map<string, Type>((info) => {
if (someFailingCondition(info)) {
throw(`Failed`);
}
/* Pass-through operation */
return pld;
})
})
/* Rest of chain */