rxjs auditTime仅适用于相同的值

时间:2019-05-22 07:14:59

标签: rxjs

我有一个发送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)

1 个答案:

答案 0 :(得分:2)

您可以使用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秒的时间窗口内忽略其他请求。