为什么"合并"操作符在源可观测性完成之前就完成了



我有两个源可观察器,当其中一个发出值时,不管它们是否完成,我都想做一些事情:

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)

我的理解是,只有当所有源可观测性都完成时,合并才会完成。那么,为什么onEather正在完成呢?

这是因为您正在将数组传递到merge中。它应该是一个参数列表。更改为:

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

它之所以完成,是因为rxjs内部调用了from方法,该方法将数组转换为可观察的数组元素流。因此,基本上,onEither$接收到两个发射,这两个发射具有数组中两个可观察对象的值。在这些发射之后,可观测到的就完成了。

数组中的可观察性是不受影响的,因为它们只是用作一个值,而实际上并没有订阅

最新更新