Observables: как вначале вести себя с другими операторами? - PullRequest
0 голосов
/ 21 декабря 2018

Я искал ответ, но не смог найти ничего убедительного.Что происходит, когда я использую оператор 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);

1 Ответ

0 голосов
/ 22 декабря 2018

Если вы используете switchMap, concatMap или mergeMap (flatMap) после first (), это может привести к нескольким событиям, зависящим от вашего кода, поэтому проверьте код, если он генерирует события.Обычное map не может привести к новому событию.

// this stream emits event every second.
stream$.pipe(
  first(),
  mergeMap(() => interval(1000)
);

Нет необходимости ставить first в начале и в конце.Поместите его в начало, если вы знаете, что у вас нет потока в потоке (не вызывайте mergeMap как операторы).В других случаях ставьте на first в конце.

...