首页 > 解决方案 > 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)

标签: rxjs

解决方案


您可以使用groupBy某些参数对传入的请求进行分组。然后分别对每个组进行节流。

import { throttleTime, mergeMap, groupBy } from 'rxjs/operators';

requestStream$
  .pipe(
    groupBy(request => request.url),
    mergeMap(group => group.pipe(throttleTime(1000)))
  )

我使用throttleTime而不是auditTime因为你不会得到你描述的行为auditTimeauditTime最初将等待 1 秒,然后仅在 1 秒时间窗口内发出最后一个请求,而throttleTime将立即发出第一个请求,然后在 1 秒时间窗口内忽略进一步的请求。


推荐阅读