将 Promise<Observable<HttpEvent<any>>> 压缩为 Observable<HttpEvent<any>>

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

给定的 Angular HTTP 拦截器必须实现

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

returned Observable<HttpEvent<any>> 通常是 next.handle(req) 的产物(在 - 也许 - 以某种方式修改请求之后)。

在我的例子中,我需要设置一些 headers,但要找到哪个 headers,我需要在内部调用一些 return Promises 的方法。像这样:

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});
  });
  ...
}

我需要使用 req1:

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

现在我有一个 Promise<Observable<HttpEvent<any>>>,但我需要以某种方式将它转换为 Observable<HttpEvent<any>>

从概念上讲,我认为这在某种程度上是有效的,因为 PromisesObservables 都是未来值。

我很确定这是一个简单的转换,但我不知道如何实现。

编辑

这可能有效:from(x).pipe(mergeAll())。但我会继续寻找更具可读性的内容。

下面的怎么样:

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

或可选:

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