Почему оператор `слияния 'завершается до завершения исходных наблюдаемых? - PullRequest
1 голос
/ 09 апреля 2020

У меня есть две исходные наблюдаемые, и я хочу что-то сделать, когда любой из них выдаст значение, независимо от того, завершено ли оно:

const observable1$ = interval(1000);
const observable2$ = interval(2000);
const onEither$ = merge([
  observable1$,
  observable2$,
]);

observable1$.pipe(tap(() => console.log('observable1 emit')), finalize(() => console.log('observable1 complete'))).subscribe();
observable2$.pipe(tap(() => console.log('observable2 emit')), finalize(() => console.log('observable2 complete'))).subscribe();
onEither$.pipe(tap(() => console.log('onEither emit')), finalize(() => console.log('onEither complete'))).subscribe();

То, что я вижу:

onEither emit
onEither complete
observable1 emit
observable2 emit
...(observable1 and 2 repeat)

Насколько я понимаю, слияние завершается только тогда, когда все исходные наблюдаемые завершены. Так почему же завершение?

1 Ответ

3 голосов
/ 09 апреля 2020

Это потому, что вы передаете массив в слияние. Это должен быть список параметров. Измените на:

const onEither$ = merge(
  observable1$,
  observable2$,
);

Причина, по которой он завершается, заключается в том, что внутренне rx js вызывает метод from, который преобразует массив в наблюдаемый поток элементов массива. Таким образом, в основном ваш onEither$ получает два выброса, которые имеют значение обоих наблюдаемых объектов в массиве. После того, как они были выпущены, наблюдаемое завершается.

Наблюдаемые в массиве остаются нетронутыми, потому что они просто используются в качестве значения и фактически не подписываются на

...