使用Angular 4.3.1和HttpClient,我需要将异步服务的请求和响应修改为httpClient的HttpInterceptor,
修改请求的示例:
export class UseAsyncServiceInterceptor implements HttpInterceptor {
constructor( private asyncService: AsyncService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// input request of applyLogic, output is async elaboration on request
this.asyncService.applyLogic(req).subscribe((modifiedReq) => {
const newReq = req.clone(modifiedReq);
return next.handle(newReq);
});
/* HERE, I have to return the Observable with next.handle but obviously
** I have a problem because I have to return
** newReq and here is not available. */
}
}
响应的问题不同,但我需要再次applyLogic以更新响应。在这种情况下,角向导建议如下:
return next.handle(req).do(event => {
if (event instanceof HttpResponse) {
// your async elaboration
}
}
但是“do()操作符-它在不影响流值的情况下为Observable添加了副作用”。
**解决方案:**关于请求的解决方案由bsorrentino显示(进入接受的答案),关于响应的解决方案如下:
return next.handle(newReq).mergeMap((value: any) => {
return new Observable((observer) => {
if (value instanceof HttpResponse) {
// do async logic
this.asyncService.applyLogic(req).subscribe((modifiedRes) => {
const newRes = req.clone(modifiedRes);
observer.next(newRes);
});
}
});
});
因此,如何将请求和响应与异步服务一起修改到httpClient拦截器中?
**解决方案:**利用rxjs
8条答案
按热度按时间ymdaylpp1#
如果你需要在拦截器中调用一个异步函数,那么可以使用
rxjs
from
操作符来执行以下方法。czq61nw12#
我认为有一个关于React流的问题。方法intercept期望返回一个 Observable,你必须用next.handle返回的 Observable 来 * flatten* 你的异步结果
试试这个
也可以使用switchMap代替mergeMap
4dc9hkyq3#
我在拦截器中使用了一个async方法,如下所示:
h7wcgrx34#
HttpInterceptor与Angular 6.0和RxJS 6.0的异步操作
auth.interceptor.ts
auth.service.ts
w46czmvw5#
上面的答案似乎很好。我有相同的要求,但面临的问题,由于更新不同的依赖关系和运营商。花了我一些时间,但我找到了一个解决这个具体问题的工作方案。
如果你使用的是Angular 7和RxJs版本6+,并且要求异步拦截器请求,那么你可以使用这个代码,它可以与最新版本的NgRx存储和相关依赖项一起工作:
1dkrff036#
这是我在Angular 15中的解决方案,它是我需要修改所有响应的地方。张贴,因为它花了我更长的时间比我想承认,为了让这个工作。
我使用Nswag在API端生成请求/响应类型和Mediatr。我有一个带有success & proceed bools的通用响应类。每个API调用都用这些来响应。这个设置允许我有大量的控制,并使处理错误和东西整洁时,使用toastr。
wqlqzqxt7#
好的,我正在更新我的答案,你不能在异步服务中更新请求或响应,你必须像这样同步更新请求
pgx2nnw88#
如果我得到你的问题比你可以拦截您的请求使用延迟