不推荐使用 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()
vsawait lastValueFrom(categories$)
toPromise
的类型信息错误。当源Observable
完成而没有发出单个值时 - 它 用undefined
解决。在这种情况下它应该拒绝。Promise
是一个 “承诺”当它解决一个值时,它会在那里 - 就是这样undefined
。但是当流在没有发出值的情况下完成时 您无法区分发出undefined
的流 目的和完成后不再发射的流
接下来应该使用什么?
如果你真的坚持以承诺的方式去做,lastValueFrom
/firstValueFrom
。否则切换到响应式编程将是可行的方法。
这个链接应该有帮助-
https://indepth.dev/posts/1287/rxjs-heads-up-topromise-is-being-deprecated
【讨论】:
感谢您的回复和链接,这正是我想要的【参考方案2】:firstValueFrom
和 lastValueFrom
绝对是更好的选择,原因有很多:
-
命名更具可读性和自我解释性。
选择第一个或最后一个值的附加功能。
在 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使用方式