【发布时间】:2021-04-15 07:44:37
【问题描述】:
给定一组项目,在任何项目/项目属性的特定时间间隔内跟踪/监控/计数变化的最佳方法是什么?
更具体地说,我需要能够监控变化并通知特定的动态条件。
到目前为止我的解决方案:
每次发生变化时,我都会在 ReplaySubject 中推送数据更改日志。
我订阅了这个主题并应用了一些自定义运算符,这些运算符过滤特定列并计算更改。
例如。 '如果项目 Y 的属性 X 在过去 5 秒内更改了 2 次,请通知我'
// const dataChangeLog$ = new ReplaySubject(...)
dataChangeLog$.pipe(
filterColumnChanges('columnName'), // filters only changes on the given column
windowTime(5000),
switchMap((change$) => change$.pipe(countCellChanges(2)))
);
const countCellChanges = (
limit: number,
reset = true
): MonoTypeOperatorFunction<DataChangedLogEntry> => {
return (source$) =>
defer(() => {
const counterMap = new Map<unknown, number>();
const getCellCounter = (dataChangeLog: DataChangedLogEntry) =>
counterMap.get(dataChangeLog.primaryKeyValue) ?? 0;
return source$.pipe(
tap((dataChangeLog) => {
let currentCounter = getCellCounter(dataChangeLog);
counterMap.set(dataChangeLog.primaryKeyValue, ++currentCounter);
}),
filter((dataChangeLog) => {
return getCellCounter(dataChangeLog) >= limit;
}),
// if limit is reached, reset it
tap((dataChangeLog) => {
if (reset) {
counterMap.set(dataChangeLog.primaryKeyValue, 0);
}
})
);
});
};
问题是计数器每 5 秒重置一次,无论我在此间隔内进行了多少更改。
我真正需要的是检查每一次排放是否在最后 Y 秒内至少有 X 次排放。
【问题讨论】:
-
看看
bufferTime运算符,看看它是否能帮到你:)
标签: javascript typescript rxjs