【问题标题】:How can I introduce an artificial delay based on the HTTP Response如何基于 HTTP 响应引入人为延迟
【发布时间】:2019-11-29 12:00:10
【问题描述】:

我有一个 API 可以返回“RequestedTooSoon”响应并包含“NotBefore”时间戳。

我的目标是引入人为的延迟,以便让任何消费者都觉得请求花费的时间比实际时间长。响应应该延迟到“NotBefore”时间过去。

// Consumer:
verifyAuth() {
  authService.verify(...).subscribe(...)
}

在我的AuthService.verify(...) 方法中,我试图限制响应,但是仔细阅读RxJS 文档,很明显throttle 不是我正在寻找的运算符:

this.apiHttp.post<VerificationResponse>('api/verify', ...)
  .pipe(
    throttle(response => {
      const nowInMs = Date.now();
      const throttle = response.NotBefore.getTime() - nowInMs;

      return timer(throttle);
    })
  )

我无法确定合适的运算符(如果存在的话)。

是否有开箱即用的运算符可以实现我所追求的?还是有更合适的方法?

我的下一步将是实现一个接受durationSelector 的delay 运算符。

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    已经有一个延迟,看到它需要一个固定值,你需要 switchMap 到它,这样你就可以运行一个函数来确定输入的时间

    this.apiHttp.post<VerificationResponse>('api/verify', ...)
      .pipe(
        switchMap(response => of(response).pipe(
          delay(response.NotBefore.getTime() - (new Date()).getTime()))
        )
      )
    

    【讨论】:

    • 看起来这种方法可以满足我的需求。我唯一的批评(可能是对 RxJS 本身的批评)是感觉有点像滥用switchMap。我并不是真的“切换到一个新的 observable”。我想我可以把它想象成从响应切换到延迟响应。
    • 你需要 switchMap 因为你不知道创建 observable 时的延迟,你需要用响应中的数据计算延迟时间。如果您想延迟一个可以在收到响应之前计算的值,那么您不需要 switchMap。
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 2019-09-11
    • 2019-06-29
    • 2020-08-14
    • 2015-01-02
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多