我有一个NestJS应用程序,需要发送一个HTTP请求到另一个服务器,所以我使用HttpModule (@nestjs/axios)。
我需要来自该请求的数据,但是返回的类型是
阅读RxJS文档,看起来处理这种情况的规定方法是使用RxJS的lastValueFrom()或firstValueFrom(),在弃用toPromise()之后。
但是,附加了一个警告:
只有当你知道一个Observable最终会完成时才使用lastValueFrom函数。如果你知道一个Observable至少会发出一个值或者最终会完成,就应该使用firstValueFrom函数。如果源Observable没有完成或发出,你最终会得到一个挂起的Promise,并且可能所有异步函数的状态都挂在内存中。为了避免这种情况,可以考虑添加一些类似timeout、take、takeWhile或takeUntil之类的东西。
我想到的解决方案是:
const response = this.httpService.post('the-url').pipe(take(1))
const axiosResponse: AxiosResponse = await lastValueFrom(response)
TypeScript至少没有抱怨。这是获得底层Axios响应的合适方法吗?
一个承诺一旦被触发,将只会被解决或拒绝一次。一旦它被解析,这个可观察对象就完成了。这是promise和observable之间的主要区别之一,后者可以像callback那样发出多次。
因此不需要添加pipe(take(1))
,只用lastValueFrom
就足够了
如果你从promise构建一个可观察对象,你不需要lastValueFrom
和take
。一旦订阅,它发出一次,然后立即完成:
const {from} = rxjs;
const answer$ = from(Promise.resolve(42));
answer$.subscribe({
next(x) {
console.log(`answer=${x}`);
},
complete() {
console.log('done');
}
});
<script src="https://unpkg.com/rxjs@%5E7/dist/bundles/rxjs.umd.min.js"></script>