【问题标题】:distinctUntilChanged in nested pipe with switchMapdistinctUntilChanged 在带有 switchMap 的嵌套管道中
【发布时间】:2019-11-25 16:33:20
【问题描述】:

我有一个可观察的流设置如下。我有一个间隔,每两秒轮询一次。然后我 switchMap 以进行两个相关的 API 调用(这里用'of's 模拟)。之后,我想使用 distinctUntilChanged 来确保最终对象不同。唯一的问题是 distinctUntilChanged 不会触发。

我假设它与我们正在创建新流的事实有关,因此从不收集两个对象进行比较,但我不完全理解。

interval(2000).pipe(
    switchMap(() => loadData()),
  )
  .subscribe(res => console.log(res)); // { name: 'test' } is printed every two seconds

function loadData() {
  return of('API call').pipe(
     mergeMap(numb => of({ name: 'test' })),
     distinctUntilChanged((prev, cur) => {
       console.log('CompareFn'); // This will never fire.
       return JSON.stringify(prev) === JSON.stringify(cur)})
  );
}

Stackblitz:https://stackblitz.com/edit/rxjs-ko6k3c?devtoolsheight=60

在这种情况下,我希望下一个处理程序只打印一个值,因为 distinctUntilChanged 应该停止第一个值之后的所有值。

希望能解释一下为什么这不能像我预期的那样工作。

【问题讨论】:

    标签: rxjs5 rxjs6


    【解决方案1】:

    问题是您的 distinctUntilChanged 是在内部 observable 上运行,而不是在外部...您需要这样做

    interval(2000).pipe(
        switchMap(_ => loadData()),
        distinctUntilChanged((prev, cur) => {
           console.log('CompareFn');
           return JSON.stringify(prev) === JSON.stringify(cur);
        })
      )
      .subscribe(res => console.log(res));
    
    function loadData() {
      return of('API call').pipe(
         mergeMap(numb => of({ name: 'test' }))
      );
    }
    

    在您之前的设置中,只有一个值达到 distinctUntilChanged,因为间隔通过 switch map 切换到新的 observable。

    【讨论】:

    • 啊,灯泡时刻!非常感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多