【问题标题】:Delay HTTP-Requests with RxJS operators使用 RxJS 操作符延迟 HTTP 请求
【发布时间】:2018-11-26 12:07:21
【问题描述】:

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

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

这是一个可行的解决方案,可以满足我的需求。但是我想知道是否有更多类似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 => {
});

【问题讨论】:

    标签: javascript rxjs delay


    【解决方案1】:

    您可以改用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)));
      }),
    ).
    

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 2021-05-22
      相关资源
      最近更新 更多