如何使用 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
(内部通过scan
或side-effects
处理特定问题,但封装在custom-operator
中。
leave rxjs for the time of state
(如上所述)。
TLTR:如果您需要随着时间的推移处理状态,我认为在您需要它的地方转义 rxjs,并在完成处理后返回它。
【讨论】:
感谢您的想法。据我所知,distinctUntilChanged
运算符只能与前一个比较,并且只能与前一个比较。我需要与最近几次发出的所有值进行比较。以上是关于如何使用 rxjs 算子多次获取最近的值的主要内容,如果未能解决你的问题,请参考以下文章