rxjs - rxjs auditTime 仅适用于相同的值
问题描述
我有一个发送 AJAX 请求的函数。如果它们发生得太频繁,我想忽略这个函数的额外调用。我可以使用 auditTime() 运算符来做到这一点:
const requestStream$ = new Subject<IRequestOptions>();
requestStream$
.pipe(
auditTime(1000) // no more than 1 time in 1 second
)
.subscribe(requestOptions => {
// send AJAX
});
requestStream$.next({
url: 'http://example.com',
method: 'post',
headers: {}
});
问题是我只需要忽略具有相同参数的请求:
requestStream$.next('site1');
requestStream$.next('site1'); // call after 500 msec (ignore)
requestStream$.next('site1'); // call after 500 msec (not ignore because it is 1000 msec from first request)
requestStream$.next('site2'); // call after 500 msec (must NOT ignore because there is different url)
解决方案
您可以使用groupBy
某些参数对传入的请求进行分组。然后分别对每个组进行节流。
import { throttleTime, mergeMap, groupBy } from 'rxjs/operators';
requestStream$
.pipe(
groupBy(request => request.url),
mergeMap(group => group.pipe(throttleTime(1000)))
)
我使用throttleTime
而不是auditTime
因为你不会得到你描述的行为auditTime
。auditTime
最初将等待 1 秒,然后仅在 1 秒时间窗口内发出最后一个请求,而throttleTime
将立即发出第一个请求,然后在 1 秒时间窗口内忽略进一步的请求。
推荐阅读
- laravel - 找不到碳文件 Vagrant
- python - Flask 服务自包含的静态项目
- tensorflow - Keras 进度条中的准确度是什么意思?
- dialogflow-es - 谷歌上 alpha 测试人员的问题
- xcode - Xcode 10 最近的项目无法正常工作
- php - PHP 目录问题,无法使用 (../) 返回目录
- sql - 与直接函数调用相比,为什么 CROSS APPLY with Functions 这么慢?
- javascript - 如何检查对象是否已经在 three.js 场景中然后替换它?
- assembly - 汇编(AT&T 格式)操作数值
- c++ - std::vector 移动而不是交换到空向量并释放存储空间