Angular-承诺的拦截器HTTP返回值

时间:2018-08-30 18:58:19

标签: angular http interceptor

我必须通过拦截器在请求返回的主体上应用解密,但是解密的方法是异步的,并返回一个Promise。

这是节课的摘录:

intercept(req: HttpRequest, next: HttpHandler): Observable> {

return next.handle(req).pipe(map((event: HttpEvent<any>) => {
  if (event instanceof HttpResponse) {
    let _body;

    this.cryptMethod.decrypt(event.body).this(res => _body = res); // Método assíncrono

    return event.clone({ body: JSON.parse(_body) });

  }
  return event;
}));
}`

事实证明,“ this.cryptMethod.decrypt()”是异步的,因此在填充_body之前已返回。

对此有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

您可以从mergeMap返回承诺,并将map链接到承诺。除了使用.then之外,您还可以使用async

.pipe(mergeMap(async (event: HttpEvent<any>) => {
  if (event instanceof HttpResponse) {
    const _body = await this.cryptMethod.decrypt(event.body);
    return event.clone({ body: JSON.parse(_body) });
  }
});

您也可以这样做:

.pipe(
  mergeMap(async (event: HttpEvent<any>) => {
    if (event instanceof HttpResponse) {
      return this.cryptMethod.decrypt(event.body);
    }
  }),
  map(_body => {
    if (_body) {
      return event.clone({ body: JSON.parse(_body) });
    }
  })
);

...但是它比较冗长,需要两个条件检查。