Если вы хотите, чтобы он был асинхронным c и его ошибка должна быть обнаружена, вам необходимо использовать mergeMap
или любой другой подходящий оператор для его обработки внутри контекста потока, потому что tap
вызывает побочные эффекты за пределами stream.
const myAsyncFunction = () => {
// a sample of promise.
return new Promise(resolve => {
setTimeout(() => {
console.log('Promise!');
resolve();
}, 1000);
});
}
@Injectable()
export class MyInterceptor implements NestInterceptor {
async intercept<T>(context: ExecutionContext, next: CallHandler): Promise<Observable<T>> {
await doBegin();
return next
.handle()
.pipe(
mergeMap(value => from(myAsyncFunction()).pipe(
ignoreElements(),
// catchError(() => EMPTY), // catching all errors.
endWith(value),
)),
tap(
() => {}, // nothing to do here, we need error.
(e) => console.error(e), // or catchError if you wan't to handle it.
),
);
}
}
, если вас не волнуют его ошибки - просто позвоните .then
.
@Injectable()
export class MyInterceptor implements NestInterceptor {
async intercept<T>(context: ExecutionContext, next: CallHandler): Promise<Observable<T>> {
await doBegin();
return next
.handle()
.pipe(
tap(
myAsyncFunction, // if it returns `new Promise` - it will work.
(e) => console.error(e),
),
);
}
}