我想将错误记录到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
(内部通过scan
或side-effects
处理特定问题,但包装在custom-operator
中。leave rxjs for the time of state
(如上述)。 TLTR:如果需要随着时间的推移处理状态,我认为在需要的地方逃避rxjs,并在完成处理后返回到状态。
关于angular - 如何使用rxjs运算符多次获取最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58947016/