为什么我的Observable发出的值比预期的多,为什么auditTime是修复程序?

问题描述

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

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

this.selectedCollection.pipe(
  filter((v) => !!v)).subscribe((v) => {
    console.log('PIPE: selected collection',v.collectionId);
    this.store.dispatch(
      // action jackson on redux
    )
  );
});

此处要分派的操作是用于加载集合的资产。认情况下,始终总是首先加载一个集合,这与用户的进一步选择相冲突。

我还在相关的reducer和效果添加了console.logs以可视化行为。

浏览器刷新会发生什么:

enter image description here

集合 9-em ... 是我们不想看到的认集合,集合 9uem ... 是我们想要其资产的用户选择看。

前五行显示了可观察值的预期输出

  • 认收藏集设置为选定收藏
  • 减速器“正在装载”资产
  • 用户触发更改选择的收集操作
  • 所选收集的值正在更新并相应地发出

现在,我们可以预期加载资产的效果了,仅此而已。但是发生的事情是管道再次发出相同的值,这很奇怪,因为我100%肯定没有从任何地方设置进一步的值。但这也可以,因为我们最终获得了所需的值。但是奇怪的是,reducer以相反的顺序处理加载操作,这导致加载错误的资产(这可能是一个完全不同的问题)。

auditTime(200)作为第一个运算符添加到上述管道中,从而解决了该问题。没有其他值发出。

现在,我的问题是:

  • 为什么这些值发出两次?可以在别的地方使用操作员/订阅不当(看不到任何可疑的东西)吗?
  • 为什么 auditTime(200)神奇地解决了这个问题?

效果还可以作为要过滤的动作的管道,并且在执行之前包含 auditTime(200)运算符,因此它仅对最后一个动作执行。尽管我确实从原则上理解了它的作用,但我不确定是否仅因为它有效就能使用 auditTime 这样的想法。

我认为这是出于菜鸟混乱的问题,导致使用rxjs的方式不正确。不幸的是,我在Google上找不到任何有用的东西。我真的不喜欢通过添加一行我不懂的代码来“修复”错误

非常感谢您!

根据fridoo的要求,这是 this.selectedCollection 代码

get selectedCollection(): Observable<collectionState.CollectionsData> {
  return this.store
     .select(collectionState.getSelectedCollection)
     .pipe(distinctUntilChanged());
}

对于 getSelectedCollection

export const getSelectedCollection: (state: any) => CollectionsData = (state: any) =>
getCollectionsstate(state)
  ? getCollectionsstate(state).selectedCollection
  : undefined;

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

select<T>(fn: (state: any) => T): Observable<T> {
  return this.state$.pipe(map(fn),distinctUntilChanged());
}

这进一步帮助了吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)