用多个热可观察对象完成一个热可观察链

Completing a hot observable chain with multiple hot observables

所以当第一个可观察对象触发其完成处理程序时,我需要一个完整的热可观察链。

一个例子可能更简单:

const hot1 = new Rx.Subject();
const hot2 = new Rx.Subject();

const example = hot1
  .do(() => console.log('HOT1 emitted'))
  .switchMap(() => hot2.do(() => console.log('HOT2 emitted')));

const subscribe = example.subscribe({
  next: console.log,
  error: console.error,
  complete: () => console.info('CHAIN COMPLETE')
});

hot1.next();
hot2.next('abc');

hot1.complete();

演示:http://jsbin.com/berexexoyu/edit?js,console

I need CHAIN COMPLETE to be output when I call hot1.complete().

能否在不进入命令式领域的情况下从功能上解决这个问题?

它可能看起来有点乱,但由于您只想通过完成 hot1 来控制链,您可以在 hot1 完成后使用 takeUntil 来完成链,同时忽略其所有值:

const hot1 = new Subject();
const hot2 = new Subject();

const example = hot1
  .do(() => console.log('HOT1 emitted'))
  .switchMap(() => hot2.do(() => console.log('HOT2 emitted')))
  .takeUntil(hot1.ignoreElements().concat(Observable.of(1)));

const subscribe = example.subscribe({
  next: console.log,
  error: console.error,
  complete: () => console.info('CHAIN COMPLETE')
});

hot1.next();
hot2.next('abc');

hot1.complete();

查看更新后的演示(打开控制台):https://stackblitz.com/edit/rxjs5-rfhpi2?file=index.ts

诀窍在于使用 hot1.ignoreElements().concat(Observable.of(1))hot1 完成后发出单个值,通知 takeUntil 并且整个链已完成。