Redux 为什么我的可观察对象发出的值比预期的要多,为什么auditTime是一个补丁?

Redux 为什么我的可观察对象发出的值比预期的要多,为什么auditTime是一个补丁?,redux,rxjs,rxjs-observables,Redux,Rxjs,Rxjs Observables,我最近在这里问了一个关于可观测的问题,你们真的帮了大忙(一如既往)。现在我也遇到了类似的情况,我和我的队友正在为此绞尽脑汁 要修复的错误是:用户看到一组资产,在浏览器刷新时加载了错误的资产集。事实证明,问题的关键在于观察当前选定集合的一个特定管道。以下是相关代码: this.selectedCollection.pipe( filter((v) => !!v)).subscribe((v) => { console.log('PIPE: selected collecti

我最近在这里问了一个关于可观测的问题,你们真的帮了大忙(一如既往)。现在我也遇到了类似的情况,我和我的队友正在为此绞尽脑汁

要修复的错误是:用户看到一组资产,在浏览器刷新时加载了错误的资产集。事实证明,问题的关键在于观察当前选定集合的一个特定管道。以下是相关代码:

this.selectedCollection.pipe(
  filter((v) => !!v)).subscribe((v) => {
    console.log('PIPE: selected collection', v.collectionId);
    this.store.dispatch(
      // action jackson on redux
    )
  );
});
此处要分派的操作用于加载集合的资产。默认情况下,始终首先加载一个集合,它与用户所做的进一步选择相冲突

我还添加了console.logs在相关的reducer和effect上,以可视化行为

浏览器刷新时发生的情况如下:

收藏9-em。。。是我们不想看到的默认集合,集合9uem。。。是用户的选择,我们希望看到其资产

前五行显示了可观测数据的预期输出:

  • 默认集合设置为所选集合
  • 减速器“正在加载”资产
  • 用户触发“更改所选集合”操作
  • 所选集合值将相应地更新和发出
现在我们已经预料到了加载资产的效果,就这样。但是发生的事情是管道再次不断地发出相同的值,这很奇怪,因为我100%确定没有从任何地方设置更多的值。但这也很好,因为我们最终得到了期望的值。然而奇怪的是,减速器以相反的顺序处理负载操作,这导致加载错误的资产(这可能是一个完全不同的问题)

将auditTime(200)作为第一个操作符添加到上面的管道中修复了该问题。没有发出进一步的值

现在,我的问题是:

  • 为什么会发出两次值?在其他地方可能是不合适的操作员/订阅(没有看到任何可疑的东西)
  • 为什么auditTime(200)神奇地解决了这个问题
该效果还可以作为过滤操作的管道,并且在执行之前包含一个auditTime(200)操作符,因此它只在最后一个操作上执行。虽然我确实在原则上理解它的作用,但我不太确定仅仅因为它工作就这样使用auditTime是否是一个好主意

我认为这是因为noob的混乱导致使用rxjs的方式不正确。不幸的是,我在谷歌上找不到任何有用的东西。我真的不喜欢通过添加一行我不懂的代码来“修复”一个bug

提前非常感谢

根据fridoo的要求,以下是此.selectedCollection的代码:

其余的只是状态对象,通过select方法创建的可观察对象。我们没有为redux使用任何库(不是我的决定),因此select的实现方式如下:

select<T>(fn: (state: any) => T): Observable<T> {
  return this.state$.pipe(map(fn), distinctUntilChanged());
}
select(fn:(状态:any)=>T):可观察{
返回此.state$.pipe(映射(fn),distinctUntilChanged());
}

这有什么帮助吗?

我想这是一个非常有趣的情况,如果你能在StackBlitz应用程序或类似的应用程序中重现它,我想找到解决方案(和问题)会容易得多。同时,您可能会发现有趣的内容。请包括
此的代码。selectedCollection
你好,fridoo,谢谢您的评论。我已经添加了代码。谢谢你的链接,安德烈。这一点解释得很好,比rxjs的文档要好得多,我经常发现rxjs的文档比较混乱我将思考这将如何影响手头的问题。
export const getSelectedCollection: (state: any) => CollectionsData = (state: any) =>
getCollectionsState(state)
  ? getCollectionsState(state).selectedCollection
  : undefined;
select<T>(fn: (state: any) => T): Observable<T> {
  return this.state$.pipe(map(fn), distinctUntilChanged());
}