Http post 请求忽略管道延迟

Http post request ignoring piped delay

在我的服务中 class 我正在发射 post 这样的请求

// my-service.service.ts
sendRequest(
    param: string
  ): Observable<HttpResponse<string>> {
    return this.http.post<HttpResponse<string>>("", {
      param
    }).pipe(
      retry(3),
    )
}

因此组件正在通过

订阅返回的Observable
// my-component.ts
this.myService.sendRequest(
      ""
    ).subscribe(
      res => {
        console.log(res)
      },
      (err: HttpErrorResponse) => {
        console.log(err.message)
      }
)

如您所见,我正在对 "" 执行 post 请求,该请求被转换为不存在的 http://localhost:4200,因此每个 post 请求都会导致Cannot POST / 响应 (404).

我不明白为什么要在

添加延迟
this.myService.sendRequest(
      ""
    ).pipe(delay(10000)).subscribe(
      res => {
        console.log(res)
      },
      (err: HttpErrorResponse) => {
        console.log(err.message)
      }
)

将导致错误响应忽略它并在控制台上打印,只要请求完成就忽略它。

delay 只延迟发射,不延迟错误。

我前段时间在 rxjs 的 repo 中开了一个讨论 -> https://github.com/ReactiveX/rxjs/discussions/6519

我认为实现您想要的唯一方法是:

this.myService.sendRequest(
  ""
).pipe(
  delay(10000),
  catchError(err => timer(10000).pipe(
    switchMap(() => throwError(() => err))
  ))
)

如果你觉得这很丑陋,你可以随时将其封装在自定义运算符中:

const delayEverything = <T>(ms: number) => (source: Observable<T>) =>
  source.pipe(
    delay(ms),
    catchError(err => timer(ms).pipe(switchMap(() => throwError(() => err))))
  )

// ... and then use it as a regular operator

this.myService.sendRequest('').pipe(
  delayEverything(10000)
)