通过RxJS运算符延迟HTTP请求

时间:2018-11-26 12:07:22

标签: javascript rxjs delay

我有一个可观察的myObservable,它以不同的时间间隔发出一些物品。例如,第一项和第二项之间的时间间隔可以是1秒,而第二项和第三项之间的时间间隔可以是3秒。 对于每个项目,使用方法this.sendMessage()发送HTTP请求。

问题在于请求之间的时间间隔应至少为2秒。将所有请求延迟两秒钟不是最佳解决方案。例如对于第一个请求,我不想延迟。当两个发射项目之间的时间差超过两秒时,我也不想延迟。

这是一个可行的解决方案,可以满足我的要求。但是我想知道是否还有类似rxjs的解决方案?我在玩delay()delayWhen(),但是我没有找到使它工作的方法。 有人有解决方案吗?

let lastSendTimestamp = null;

myObservable.pipe(
  concatMap(async body => {

    // Calculate delay time
    let delayTime = 0;
    if (!lastSendTimestamp) {
      delayTime = 0;
    } else if (Date.now() - lastSendTimestamp > 2000) {
      delayTime = 0;
    } else {
      delayTime = 2000 - (Date.now() - lastSendTimestamp);
    }

    // Wait until delay is over
    await new Promise(resolve => setTimeout(resolve, delayTime));

    lastSendTimestamp = Date.now();

    return await this.sendMessage(body);
  }),
).subscribe(result => {
});

1 个答案:

答案 0 :(得分:0)

您可以改用timer并与异步请求链接。不需要承诺

let lastSendTimestamp = null;

myObservable.pipe(
  concatMap(body => {

    // Calculate delay time
    let delayTime = 0;
    if (!lastSendTimestamp) {
      delayTime = 0;
    } else if (Date.now() - lastSendTimestamp > 2000) {
      delayTime = 0;
    } else {
      delayTime = 2000 - (Date.now() - lastSendTimestamp);
    }
    lastSendTimestamp = Date.now();
    return timer(delayTime).pipe(concatMap(res=>this.sendMessage(body)));
  }),
).