gpt4 book ai didi

javascript - HttpInterceptor 在拦截器内调用另一个服务并等待响应

转载 作者:行者123 更新时间:2023-11-28 03:18:34 25 4
gpt4 key购买 nike

如果满足特定条件,我必须在拦截器中调用另一个服务,并且我希望原始服务等待新服务完成。我的第一个解决方案是使用 Tap:

intercept(req: HttpRequest<any>, options: any, next: HttpServiceHandler)
: Observable <HttpEvent<any>> {
return next.handle(req, options).pipe(
tap((event: HttpEvent<any>) => {
if (event instanceof HttpResponse && event.ok && event.body) {
const productsToGet = [...]
if (* condition *) {
const resourceService = this.injector.get(ResourceService);
return resourceService.getProducts(productsToGet);
}
}
})
);
}

但它显然没有像我想要的那样工作,因为原始方法在 getProducts 完成之前完成。然后我使用了这个 thread 中的解决方案使用 switchMap:

return next.handle(req, options).pipe(
filter((event: HttpEvent<any>) => (event instanceof HttpResponse && event.ok && event.body)),
switchMap((event: HttpResponse<any>) => {
const productsToGet = [...]
if (* condition *) {
const resourceService = this.injector.get(ResourceService);
return resourceService.getProducts(productsToGet).pipe(
mapTo(event)
)
} else {
return of(event);
}
})
);

但现在我收到错误:

Uncaught (in promise) EmptyError: no elements in sequence.

您能告诉我我的解决方案是否有效以及我应该怎样做才能使其发挥作用?

完整错误堆栈:

> Error: Uncaught (in promise): EmptyError: no elements in sequence
at resolvePromise (zone.js:852)
at resolvePromise (zone.js:809)
at zone.js:913
at ZoneDelegate.push.../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
at Object.onInvokeTask (core.js:26754)
at ZoneDelegate.push.../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
at Zone.push.../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
at drainMicroTaskQueue (zone.js:601)
at ZoneTask.push.../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:502)
at invokeTask (zone.js:1693)

最佳答案

原来是过滤器的问题。拦截器不会返回已过滤掉的响应中的可观察数据。因此,我删除了过滤器并将其添加到 switchMap 中,对于不满足过滤条件的响应返回 of(event)。

关于javascript - HttpInterceptor 在拦截器内调用另一个服务并等待响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59411483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com