这是组合不同的订阅/流的好方法吗?
我正在创建2个程序(终端流),它们相互启动并运行,直到调用返回的清理函数。
const program = () => {
let activeSubscription;
const program1 = () => fromEvent(document, 'mousemove').pipe(take(10)).subscribe(
console.log,
console.error,
() => { activeSubscription = program2() }
)
const program2 = () => fromEvent(document, 'click').pipe(take(10)).subscribe(
console.log,
console.error,
() => { activeSubscription = program1()
)
// Return clean up function
return () => activeSubscription && activeSubscription.unsubscribe()
答案 0 :(得分:1)
在Angular世界中,我们使用了对带有最终完成主题的每个订阅使用takeUntil的标准。这样,在清理功能中,您将发出一个主题,并且清理所有其他订阅。
const program = () => {
let finalise = new Subject();
const program1 = () => fromEvent(document, 'mousemove').pipe(take(10), takeUntil(finalise)).subscribe(
console.log,
console.error
)
const program2 = () => fromEvent(document, 'click').pipe(take(10), takeUntil(finalise)).subscribe(
console.log,
console.error
)
// Return clean up function
return () => {
finalise.next();
finalise.complete();
}
}
答案 1 :(得分:1)
最好避免处理多个订阅,并在单个流中合并可观察对象:
concat(
fromEvent(document, 'mousemove').pipe(take(10), tap(() => console.log('move'))),
fromEvent(document, 'click').pipe(take(10), tap(() => console.log('click')))
).pipe(repeat()).subscribe();
通过这种方式,您不必立即订阅,并且program
可以返回observable,以便以后通过管道传输/订阅。它提供了更多的灵活性。