【问题标题】:RxJS - reusing an observable which has completedRxJS - 重用已完成的 observable
【发布时间】:2019-02-23 19:35:08
【问题描述】:

Link to code in stackblitz

有没有办法多次重复完成的 observable?

假设我有一个按钮,单击该按钮会创建一个可观察到的间隔,它发出 10 个值,然后完成:

fromEvent(button, 'click').pipe(
    switchMapTo(interval(500)),
    takeWhile(i => i < 10)
)

在订阅中我想同时处理 next 和 complete 方法:

.subscribe(
    i => console.log(i),
    () => {},
    () => console.log('completed')
);

以这种方式 - 第一次点击将发出一个序列,一旦完成,后续点击将不会再次发出。有什么办法可以这样写,以便所有点击都发出序列?

【问题讨论】:

  • 一个观察者总是只能收到一个complete 通知。您可以使用repeat() 运算符,但您将永远不会看到收到任何complete 通知。
  • @martin 我们可以使用finalize 在repeat 之前捕获complete 吗?

标签: rxjs


【解决方案1】:

我认为你应该完成内部 observable 而不是整个序列。 (takeWhile 应该通过管道传送到间隔);

只有在有新的点击事件进入时您乐于关闭旧序列时才应使用switchMap。否则为mergeMap 或concatMap。

const sequence = () => interval(500).pipe(take(10));

fromEvent(button, 'click').pipe(
    switchMap(sequence),
)

【讨论】:

  • 谢谢。这适用于细微的调整:const sequence = () =&gt; interval(500).pipe(take(10),finalize(() =&gt; console.log('completed'))); fromEvent(button, 'click').pipe(switchMapTo(sequence())).subscribe(console.log);
  • 如果您直接调用sequence(),您会在定义管道时创建可观察对象,而不是在用户单击时创建。因此,将switchMapTo(sequence()) 更改为switchMap(sequence)。
猜你喜欢
  • 2017-06-14
  • 2020-03-26
  • 1970-01-01
  • 2021-11-16
  • 2016-03-09
  • 2021-08-28
  • 2019-03-06
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多