Angular - HTTP-перехватчик, возвращаемый из обещания - PullRequest
0 голосов
/ 30 августа 2018

Я должен применить дешифрование к телу возврата запроса через Interceptor, однако метод дешифрования является асинхронным и возвращает обещание.

Вот выдержка из класса:

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 голосов
/ 30 августа 2018

Вы можете вернуть обещание от 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) });
    }
  })
);

... но это более многословно и требует двух условных проверок.

...