angular - 如何使用rxjs运算符多次获取最新值

标签 angular logging error-handling rxjs

我想将错误记录到APP中的服务器上,但是如果前几次(例如一分钟)记录了相同的错误,则需要忽略记录器。
Here is a demo。现在,我使用Map()保存我发送的错误,并使用filter调整为记录器。有没有更好的方法可以使用rxjs运算符执行相同的操作。

最佳答案

这里的主要问题是,在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,并在完成处理后返回到状态。

    关于angular - 如何使用rxjs运算符多次获取最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58947016/

    相关文章:

    python - 设置 python 日志记录到标准输出的最简单方法

    php - 获取gzip压缩时出现 undefined offset 警告

    angular - 命名指令时选择器的名称

    javascript - 如何将数组键索引映射到下拉列表表单控件中的其他键名称?

    android - 将日志同时输出到文件和系统日志

    java - 为什么在使用异步记录器时使用 Log4J2 写入大量日志条目速度较慢

    javascript - 使用UpdatePanel时如何获取真正的异常消息?

    C函数错误: is it better to abort the function or simply exit the program?

    Angular/rxjs : Why don't I have to import toPromise anymore?

    angular - 带 updateOn : blur doesn't update values when submitting 的表单控件