【问题标题】:RxJS exhaustMap not behaving as expectedRxJS 排气映射未按预期运行
【发布时间】:2021-11-09 06:49:12
【问题描述】:

我正在将 exhaustMap 应用于一个 observable,从该 observable 中创建两个投影的 observable。在第一个预计的 observable 完成之前,两个预计的 observable 中的第二个不应该开始发射。因此,我希望输出 observable 能够从两个投影的 observable 中发出项目。但由于某种原因,第二个 observable 被忽略了。请注意,第二个投影的 observable 直到 7 秒后才开始发射——这远远超过了第一个投影的 observable 发出最后一个项目的时间点。这是我的代码示例:

import { from } from 'rxjs'; 
import { interval } from 'rxjs';
import { take } from 'rxjs/operators';
import { map, mergeMap, exhaustMap, delay, mergeAll } from 'rxjs/operators';

const getData = (param) => {
  if (param == 'a') {
    return interval(1000).pipe(
      map(val => param + '-' + val.toString()),
      take(4),
      delay(1000)
    )
  }
  else if (param == 'b') {
    return interval(1000).pipe(
      map(val => param + '-' + val.toString()),
      take(4),
      delay(7000)
    )
  }
}

// using exhaustMap
from(['a','b']).pipe(
  exhaustMap(param => getData(param))
).subscribe(val => console.log(val));

【问题讨论】:

  • 听起来你在寻找concatMap的行为。
  • @BizzyBob 不,我知道concatMap,我只是想更好地了解exhaustMap,现在我的困惑已经消除。不过,感谢您的建议。
  • Fan Cheung 澄清了我的误解后,我意识到任何试图以有意义的方式演示排气映射的代码片段都需要设置一个 source 可观察对象,该可观察对象发出带有分隔这些项目的一些时间间隔。例如,请查看这篇文章(并查看“Playground”代码片段):indepth.dev/reference/rxjs/operators/exhaust-map

标签: rxjs


【解决方案1】:

exhaustMap 的行为一旦被触发,它将首先执行其内部 observable,直到其完成,在此期间,来自源 observable 的发射将被忽略。因此,在您的情况下,b 将被忽略,当源发出 bexhaustMap 仍未完成时

【讨论】:

  • 请注意,第二个预计的 observable 直到 7 秒后才开始发射,这是在第一个预计的 observable 完成之后很久。但也许你是说为了不忽略第二个投影的 observable,source observable 在第一个投影的 observable 完成之前不能发出它的第二个项目。你说的是这个吗?
  • 好的,是的,我确认是在 source observable 发出它的第二个项目的时候——这必须在第一个预计的 observable 完成之后发生。
  • 很高兴它可以帮助您解决问题
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2016-08-11
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多