使用RxJS管道(take(1))是一种合适的方式来返回一个单一值的Observable吗?



我有一个NestJS应用程序,需要发送一个HTTP请求到另一个服务器,所以我使用HttpModule (@nestjs/axios)。

我需要来自该请求的数据,但是返回的类型是<any,any>>,这里我只需要AxiosResponse。

阅读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构建一个可观察对象,你不需要lastValueFromtake。一旦订阅,它发出一次,然后立即完成:

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>

相关内容

  • 没有找到相关文章

最新更新