我必须通过拦截器在请求返回的主体上应用解密,但是解密的方法是异步的,并返回一个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之前已返回。
对此有什么解决办法吗?
答案 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) });
}
})
);
...但是它比较冗长,需要两个条件检查。