【问题标题】:rxjs mapTo operator: evaluate the return value at run timerxjs mapTo 运算符:在运行时评估返回值
【发布时间】:2018-06-05 08:48:10
【问题描述】:
  function c() {
     return Math.random();
  }

  source$.pipe(
    map(a => c())
  ).subscribe(v => console.log(v));

假设有一个像上面这样的简单代码。我尝试的是在源流发出某些内容时记录值,但显然,我记录的值与源流中的值无关。所以它让我考虑像这样使用mapTo 运算符:

  function c() {
   return Math.random();
  }

  source$.pipe(
    mapTo(c())
  ).subscribe(v => console.log(v));

但正如您可能猜到的那样,该值始终是相同的。更准确地说,它仍然是第一个值,这不是我想要的。

所以我的意思是,我希望每次源发出我在评估时不使用的值时执行评估。我可以通过使用map 运算符让它像第一个代码一样工作,但是当我不使用源流中的值时,使用map 似乎并不正确。像这样使用map 可以吗?或者有没有使用mapTo 或其他方法来解决此类问题?任何见解将不胜感激!

【问题讨论】:

  • 你的用例真的涉及随机数吗?还是其他形式的外部状态?最好避免外部状态,所以我觉得您的问题可能还有更多。
  • @cartant 它不涉及随机数,但我想返回一个每次都需要评估的值,但与源流中的值无关
  • 我认为您对map 所做的一切都很好。如果您不需要来自源 Observable 的值,您可以通过完全不将其包含在参数中来使其更加明显map(() => c())
  • 比 mapTo 短:source$.pipe(map(c))
  • @martin 明白了!谢谢。

标签: rxjs


【解决方案1】:

根据official definition,每次源 Observable 发出一个值时,mapTo 都会在输出 Observable 上发出 给定的常量值

因此,您描述的行为是预期的行为。来自Math.random() 的第一次评估会被保留并每次发出。

在这里使用map 来获取您期望的随机值似乎没有错。

【讨论】:

  • 是的,我也这么认为,但在使用 map 运算符时不使用源流中的值,我不禁感到错误/尴尬。
  • 嗯,每个项目都是独一无二的,每个用例也是如此。如果您想在源发出时发出随机值而不关心源值,那么使用 map 可能是一种方式。
  • 完全忽略源的价值并没有错。它也不是异国情调——它经常发生。 Observables 有一个数据和一个时间分量,忽略参数仅仅意味着你只对时间分量感兴趣。没有错。
  • @IngoBürk 感谢您的洞察力!
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多