Using Angular 4.3.1 and HttpClient, I need to modify the request and response by async service into the HttpInterceptor of httpClient,
Example for modifying the request:
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. */
}
}
Different problem for the response, but I need again to applyLogic in order to update the response. In this case, the angular guide suggests something like this:
return next.handle(req).do(event => {
if (event instanceof HttpResponse) {
// your async elaboration
}
}
But the "do() operator—it adds a side effect to an Observable without affecting the values of the stream".
Solution: the solution about request is shown by bsorrentino (into accepted answer), the solution about response is the follow:
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);
});
}
});
});
Therefore, how modify request and response with async service into the httpClient interceptor?
Solution: taking advantage of rxjs
I think that there is a issue about the reactive flow. The method intercept expects to return an Observable and you have to flatten your async result with the Observable returned by next.handle
Try this
Asynchronous operation in HttpInterceptor with Angular 6.0 and RxJS 6.0
auth.interceptor.ts
auth.service.ts
Ok i am updating my answer, You cannot update the request or response in an asynchronous service, you have to update the request synchronously like this
The answers above seem to be fine. I had same requirements but faced issues due to update in different dependencies and operators. Took me some time but I found one working solution to this specific issue.
If you are using Angular 7 and RxJs version 6+ with requirements for Async Interceptor request then you can use this code which works with latest version of NgRx store and related dependencies:
If you need to invoke an async function within interceptor then the following approach can be followed using the
rxjs
from
operator.If I get your question right than you can intercept your request using deffer