gpt4 book ai didi

async-await - 在 RxJS NextObserver 中使用异步方法

转载 作者:行者123 更新时间:2023-12-03 19:11:20 25 4
gpt4 key购买 nike

我正在尝试在 NestJS 拦截器中使用异步函数。这些拦截器使用 RxJS Observables,如下所示:

@Injectable()
export class MyInterceptor implements NestInterceptor {
async intercept<T>(context: ExecutionContext, next: CallHandler): Promise<Observable<T>> {
await doBegin();
return next
.handle()
.pipe(
tap(
() => console.log("Done"),
(e) => console.error(e)
)
);
}
}

这可行,但如果我想要 tap 中的方法怎么办?异步? method signature是:
(value: T) => void

我可以在那里放一个异步方法吗?还是我应该采取不同的方法?

最佳答案

如果您希望它是异步的并且应该捕获它的错误,您需要使用 mergeMap或任何其他合适的运算符来在流上下文中处理它,因为 tap导致流之外的副作用。

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

关于async-await - 在 RxJS NextObserver 中使用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62017504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com