Я искал ответ, но не смог найти ничего убедительного.Что происходит, когда я использую оператор first
на observable
, а затем передаю другие операторы поверх него, например swtichMap
или map
.
Что я знаю, когда использую first
, а затем подписываюсьон будет жив, пока не будет возвращено первое значение:
myObs.first().subscribe(console.log);
// I shouldn't be worried about unsiscribe
myObs.pipe(first()).subscibe(console.log);
// The same here
Но что произойдет, когда я передам другие функции, я разделю вопрос на две части, во-первых, что произойдет, когда я использую простые операторы (операторы, которые нене возвращайте другие наблюдаемые):
// 1. Will this subscription end on first emitted value?
myObs.first().pipe(map(data => return data.content)).subscribe(console.log);
// 2. Is this different from (1)
myObs.pipe(first(), map(data => return data.content)).subscribe(console.log);
// 3. Will this subscription end on first emitted value?
myObs.pipe(map(data => return data.content), first()).subscribe(console.log);
То, что я думаю, происходит:
- (1) и (2) одинаковы, и подписка будет жить вечно, если мы не будемне отписаться, но он будет излучать только одно значение.Внутренняя подписка закончится, а внешние подписки не будут.
- (3) В противоположность (1,2), внутренняя подписка будет существовать вечно, а внешняя закончится после первого значения выброса.Есть ли внутренняя подписка?или я не прав?
И, наконец, что-нибудь изменится с использованием switchMap()
?Если мы используем switchMap()
вместо flatMap()
, это будет завершать внутренние подписки с каждым новым значением, но что будет с приведенными выше заданиями?
РЕДАКТИРОВАТЬ: следует ли нам использовать first()
в качестве начала каналов и вконец, чтобы убедиться, что подписка закончится?
// 3. Has these any sense?
myObs.pipe(frist(), map(data => return data.content), first()).subscribe(console.log);