欢迎来到这个新系列角反模式。我打算盖一个反模式每周几个星期,从一个最常见的:在另一个可观测的订阅订阅一个可观测的。这里有一个例子,我们得到一个国家,然后那个国家的货币:

为什么这是一个坏主意吗?这里有几个原因:
getCurrencyForCountry ()
从来不是unsubscribed从而导致内存泄漏。- 当国家发生变化时,被前面的国家的货币的可观察到的不是取消。如果观察到的再次发出,
this.currency
会覆盖。 - 这种嵌套的回调是很难读,因此,这样的代码是更具挑战性的维护。
让我们想象一下组件模板如下:

然后在一个场景getCurrencyForCountry ()
每秒钟发出更新值,我们的组件会显示以下值,这很快成为错误的:

你可以把一个看看这段代码。
避免这类问题的解决方案是使用switchMap
操作符如下:

上述代码没问题,因为switchMap
取消之前的货币可观测只要发出一个新国家service.getCountries ()
。没有更多的内存泄漏,我们两个可见总是同步:

这里是一个链接到相同的代码示例使用switchMap操作符。