如何使用 rxjs 算子多次获取最近的值

Posted

技术标签:

【中文标题】如何使用 rxjs 算子多次获取最近的值【英文标题】:How to use rxjs operator to get recent values in serveral time 【发布时间】:2020-03-15 17:43:09 【问题描述】:

我想在APP中将错误记录到服务器,但如果之前几次(例如一分钟)记录了相同的错误,我需要忽略记录器。 Here is a demo。现在我使用 Map() 来保存我发送的错误,并使用 filter 调整到记录器。有没有更好的方法来使用 rxjs 运算符来做同样的事情。

【问题讨论】:

distinctUntilChanged运营商 【参考方案1】:

这里的主要问题是在 RxJS 中很难处理随时间累积的数据。 解决此问题的一种方法是将 RxJS 留到该特定点,然后再返回。

sourceString = "Hello, It's me. I was wondering if after all these years you'd like to meet";
errorCache = new Map();
errorLogger$$= new Subject<string>();

interval(1000).pipe(
  map(v =>this.sourceString.slice(v % this.sourceString.length,(v % this.sourceString.length) + 1))
).subscribe(v => tryToErrorLog(v))

function tryToErrorLog(msg: string): 
  const alreadyHaveErrorLog = this.errorCache.get(msg);

  if (!alreadyHaveErrorLog) 
    return;
  

  this.addError(msg);


function addError(msg: string): 
  this.errorCache.set(msg);
  this.errorLogger$$.next(msg);


解释: 然后,您可以使用您的 errorLogger$$ 来处理您的错误。或者,您可以使用扫描运算符,但最终它总是相同的:您需要一个存储和比较数据的地方(例如:tryToErrorLog 和 errorCache)。在扫描中,它将是累积值而不是局部变量。

类似问题: 如果您必须添加,随着时间的推移从数组/映射中删除值。

可能的解决方案:

scan + filter side-effects(就像你对 map/localvariable/tap 所做的那样) custom-operator(内部通过scanside-effects 处理特定问题,但封装在custom-operator 中。 leave rxjs for the time of state(如上所述)。

TLTR:如果您需要随着时间的推移处理状态,我认为在您需要它的地方转义 rxjs,并在完成处理后返回它。

【讨论】:

感谢您的想法。据我所知,distinctUntilChanged 运算符只能与前一个比较,并且只能与前一个比较。我需要与最近几次发出的所有值进行比较。

以上是关于如何使用 rxjs 算子多次获取最近的值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用NodeJs中的rxjs中的forkjoin进行多次调用,使用NPM请求

使用 rxjs 时如何获取错误的堆栈跟踪?

如何使用rxjs从后端api获取头属性?

rxjs中多次调用的角度处理错误

如何使用 RxJS 以时间间隔调用多个依赖 api 调用

在使用带有 Angular 的 FromEvent RxJS 订阅输入标签值更改时如何避免使用“任何”?