如何使用RxJS撰写订阅?

时间:2019-09-17 04:00:11

标签: rxjs

这是组合不同的订阅/流的好方法吗?

我正在创建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()

2 个答案:

答案 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,以便以后通过管道传输/订阅。它提供了更多的灵活性。