使用 switchMap 的嵌套管道中的 uniqueUntilChanged

Cur*_*rge 4 rxjs5 rxjs6

我有一个可观察的流,设置如下。我有一个每两秒轮询一次的时间间隔。然后,我将其切换为两个相关的 API 调用(此处用“of”进行模拟)。之后,我想使用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)})
  );
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

bry*_*n60 5

问题是你的distinctUntilChanged正在内部可观察上操作,而不是外部......你需要这样做

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' }))
  );
}
Run Code Online (Sandbox Code Playgroud)

在您之前的设置中,当间隔通过切换映射切换到新的可观察值时,只有一个值达到了distinctUntilChanged。