从嵌套concatMap返回不可观察的固定值

时间:2019-02-25 10:59:56

标签: rxjs rxjs5

我的用例场景如下:
我有一些可观察的链,有时我需要从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放入内部运算符系列中之后,再将内部可观测值系列重新放入平面值管道中?

1 个答案:

答案 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 */