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)
)
在我的服务中 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)
)