我正在和switchMap操作符玩,以清楚地了解“切换”内部可观察到的发生了什么。
起初,我认为switchMap只是从可观察到的开关内部“取消订阅”,但后来我意识到它实际上是“取消订阅和完成”的内部可观测性。
为了确认我已经写了这个小片段:https://codesandbox.io/s/relaxed-meninsky-c5jmw?fontsize=14
如您所见,当主题第二次发出时,将正确地调用finalize()操作符,但是:
为什么tap运算符的完整处理程序不称为?
这让我对这个操作人员的理解只感到80%的满意。
A与此无关:
我阅读和观察过许多关于switchMap的消息来源,包括:
它们中没有一个清楚地说明内部可观测性是未订阅的,还是未被描述和关闭的(或者至少我不明白:)
我看过switchMap操作符源代码,没有提到takeXXX操作符,没有它,他怎么能完成内部操作符呢?
tl;博士
发布于 2019-08-29 01:06:20
我认为您混淆了unsubscribe()和complete()之间的区别。对于像Subject这样可观察到的热点,您可以通过几种方式“停止”它。从“自顶向下”到complete(),就像在您的示例中所做的那样,或者从“底部->向上”到unsubscribe()。
switchMap()所做的正是它所说的,它从可观察到的初级变为可观察到的次要(或‘内部’)。这就是为什么当你complete()的外部可观测的,它没有影响到内部的一个-链已经被切换。要影响链(而不是仅仅影响源可观察到的主题),您需要获得对订阅者的引用,然后调用订阅者的unsubscribe()方法。
为了看这个,我用叉子叉了你的CodeSandbox并制作了这个新的
正如您将在那个CodeSandbox中看到的,我增加了几行代码来显示正在发生的事情:
tap()就在switchMap之上--这将显示在链切换到与switchMap操作符不同的可观测性之前,直接从Subject()中发生的事情。sub中捕获对链的订阅,该变量可以在以后取消订阅,从而从下到上影响链。s.complete()现在反映在主题中,并注意它是如何完全不影响链的。sub.unsubscribe()确实会杀死链。newT()方法中的newT()注释,以确保如果上面的源代码实际完成(自上而下),将调用tap的完整方法。finalize()捕捉到了取消订阅已经发生(底部>向上)的事实,请注意,当主题源上调用switchMap()时,switchMap()向上执行自动取消订阅时,以及在订阅上调用unsubscribe()时,都会发生取消订阅,这再次导致自下而上>向上终止。在任何情况下,都不会在原始观察者中调用您的complete(),因为该链从未真正完成。如果需要,可以使用take(10)操作符完成链,以查看该操作是如何工作的。
希望这能帮助消除一些混乱。:)
https://stackoverflow.com/questions/57696249
复制相似问题