Почему эти две наблюдаемые излучают разные потоки?

Я использую мраморные диаграммы, чтобы показать вывод двух разных наблюдаемых. В первом используется карта переключения, которая подключается к другой карте переключения. Вторая наблюдаемая имеет две карты переключения в одном канале.

Вот два мраморных потока:

Первый использует карты переключения внутри внутреннего канала https://rxviz.com/v/38MavX78.

Второй использует карты переключения внутри одного канала https://rxviz.com/v/9J9zNpq8.

Почему у них разный результат?


person Andre    schedule 12.09.2019    source источник


Ответы (1)


Насколько я понимаю, switchMap делает то, что звучит из названия - переключает цепочку Observable с одного Observable («внешнего») на другое («внутреннее»). Если внешний Observable испускается до завершения внутреннего, тогда switchMap откажется от этого внутреннего Observable и повторно подпишется, фактически «отменив» первую подписку. Документы здесь.

Теперь в вашем первом случае вы вложили switchMap в grandchildren$ ВНУТРИ switchmap в Children$. Поэтому, когда parent$ испустит второй раз, он отменит переключение на children$ И переключение на grandchildren$, так как grandchildren$ является частью Children$ (вложенной в него).

Однако во втором случае они не вложены друг в друга. Поэтому, когда parent$ генерируется во второй раз, это действительно отменяет подписку children$, но children$ ничего не выдает, когда это происходит, оставляя цепочку ниже нетронутой. Таким образом, grandchildren$ продолжает излучать до тех пор, пока child$ действительно не излучает что-то, что будет через 1000 мс после повторной подписки на него, когда parent$ излучает.

Надеюсь, это имеет смысл.

person dmcgrandle    schedule 12.09.2019
comment
Отличное объяснение, это действительно помогло мне понять, что происходит. Tnx - person Andre; 13.09.2019