不推荐使用 Rxjs toPromise()

Posted

技术标签:

【中文标题】不推荐使用 Rxjs toPromise()【英文标题】:Rxjs toPromise() deprecated 【发布时间】:2021-07-06 16:50:00 【问题描述】:

我读到toPromise() 在 RxJS 7 中已被弃用,并将在 RxJS 8 中删除。 我经常将它与 Angular 中的异步等待语法一起使用来处理 http 调用。它被认为是反模式吗? 我了解流的概念,但 http 调用只发出一个值。对于一个简单的 http 调用,我没有得到可观察的意义。接下来我应该使用什么?我应该完全接受反应式编程吗?

【问题讨论】:

按照惯例,在弃用中提供了替代方案:github.com/ReactiveX/rxjs/commit/… 【参考方案1】:

为什么会这样?

正如here 所述,这些是toPromise 被弃用的主要原因:

    一个目标是将其从Observable 原型中移除,并将其变成一个独立的实用程序函数。

    toPromise 的命名并不是最好的。尤其是与await结合使用时,它的阅读效果不是很好:await categories$.toPromise() vs await lastValueFrom(categories$)

    toPromise的类型信息错误。当源 Observable 完成而没有发出单个值时 - 它 用undefined 解决。在这种情况下它应该拒绝。 Promise 是一个 “承诺”当它解决一个值时,它会在那里 - 就是这样 undefined。但是当流在没有发出值的情况下完成时 您无法区分发出 undefined 的流 目的和完成后不再发射的流

接下来应该使用什么?

如果你真的坚持以承诺的方式去做,lastValueFrom/firstValueFrom。否则切换到响应式编程将是可行的方法。

这个链接应该有帮助-

https://indepth.dev/posts/1287/rxjs-heads-up-topromise-is-being-deprecated

【讨论】:

感谢您的回复和链接,这正是我想要的【参考方案2】:

firstValueFromlastValueFrom 绝对是更好的选择,原因有很多:

    命名更具可读性和自我解释性。 选择第一个或最后一个值的附加功能。 在 observable 没有发出任何值的情况下声明默认值的附加功能,就像 await lastValueFrom(data$, defaultValue: 'Some default value')

有关此结帐的更多信息,请观看以下视频:https://www.youtube.com/watch?v=3aeK5SfWBSU

【讨论】:

以上是关于不推荐使用 Rxjs toPromise()的主要内容,如果未能解决你的问题,请参考以下文章

Rxjs toPromise 行为不同于 observable

Angular 2:“Observable<Response>”类型上不存在属性“toPromise”

Angular请求同步async、await、toPromise使用方式

RXJS 中的 startWith 运算符真的被弃用了吗?

Angular 5 的 HttpClient:toPromise() 接受哪些参数?

Angular 中的“toPromise 不是函数”错误是不是有解决方案?