用多个热可观察对象完成一个热可观察链
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
并且整个链已完成。
所以当第一个可观察对象触发其完成处理程序时,我需要一个完整的热可观察链。
一个例子可能更简单:
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 callhot1.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
并且整个链已完成。