【问题标题】:How to combine observables but emit a value for each as it occurs如何组合可观察对象,但在每个对象发生时发出一个值
【发布时间】:2021-04-14 01:10:03
【问题描述】:

我想从组合的 observable 中获取每个发出的值。我不需要通过 combineLatest、forkJoin 等运算符实现的所有最终值。

我正在寻找一个可以使以下代码更短但保持相同行为的运算符。

this.keyPress$.pipe(debounceTime(1000))
.subscribe(
  (d) => {
    console.log('keypress');
    resetInterval();
  }
);

this.mouseMove$.pipe(debounceTime(1000))
.subscribe(
  (d) => {
    console.log('mouseMove');
  }
);


this.click$.pipe(debounceTime(1000))
.subscribe(
  (d) => {
    console.log('click');
  }
);

有什么方法或运算符可以用来实现这一点吗?

【问题讨论】:

  • combineLatest 不会给你最终发出的值。我认为 combineLatest 适合这里
  • combineLatest 仅在所有发射都被触发时发射,这意味着在 combineLatest 发射值之前必须发射点击、鼠标移动、按键操作

标签: javascript angular rxjs


【解决方案1】:

如果我对问题的理解正确,您可以尝试这些方法

k$ = this.keyPress$.pipe(
  debounceTime(1000),
  tasp(() => {
    console.log('keypress');
    resetInterval();
  })

m$ = this.mouseMove$.pipe(
  debounceTime(1000),
  tap(() => console.log('mouseMove'))
  );


c$ = this.click$.pipe(
  debounceTime(1000),
  tap(() => console.log('click'))
  )


merge(k$, m$, c$).subscribe()

它可能不会减少您的代码,但只需要一个显式订阅,这本身可能是一个优势,例如,如果您需要在某个时候取消订阅,那么您只需处理一个订阅。

【讨论】:

  • 是的,谢谢,如果没有办法减少代码,我可以使用该方法。我喜欢这样一个事实,即我只会使用 merge 取消订阅一次
猜你喜欢
  • 2020-02-11
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2023-02-09
相关资源
最近更新 更多