简体   繁体   中英

Squashing Promise<Observable<HttpEvent<any>>> to Observable<HttpEvent<any>>

A given Angular HTTP Interceptor must implement

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>

The returned Observable<HttpEvent<any>> usually is the product of next.handle(req) (after - perhaps - modifying the request somehow).

In my case, I need to set some headers, but to find which headers, internally I need to invoke some methods that return Promises . Like this:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  const req1: Promise<HttpRequest<unknown>> = this.service.getFutureValue().then(value => {
    const headers = req.headers.append('X-Custom-Header', value);
    return req.clone({headers});
  });
  ...
}

I need to chain next using req1 :

const x = req1.then(r => next.handle(r));

Now I have a Promise<Observable<HttpEvent<any>>> , but I need to somehow transform it to Observable<HttpEvent<any>> .

Conceptually I think this is somehow valid, given that both Promises and Observables are future values.

I'm pretty sure this is a simple transformation, but I don't see how.

EDIT

This may work: from(x).pipe(mergeAll()) . But I'll keep looking for something more readable.

How about the following:

return from(this.service.getFutureValue())
  .pipe(
    mergeMap(x => {
      const headers = req.headers.append('X-Custom-Header', x);
      return next.handle(req.clone({ headers }));
    })
  )

Or optionally:

return from(this.service.getFutureValue())
  .pipe(
    map(x => {
      const headers = req.headers.append('X-Custom-Header', x);
      return req.clone({ headers });
    }),
    mergeMap(next.handle)
  )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM