Rxjs toPromise() 已弃用

Mat*_*ias 5 javascript rxjs typescript angular

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

Tar*_*eed 31

firstValueFrom出于多种原因,它lastValueFrom绝对是更好的选择:

  1. 命名更具可读性且不言自明。
  2. 选择第一个或最后一个值的附加功能。
  3. 声明默认值的附加功能,以防可观察对象根本不发出任何值,如下所示await lastValueFrom(data$, {defaultValue: 'Some default value'})

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


Adi*_*r D 27

代码示例:

已弃用的用途:

await this.http.post<boolean>(`/someApi`).toPromise()
  .then((value) => {
    console.log(`Result: ` + value);
  })
Run Code Online (Sandbox Code Playgroud)

新代码:

import { firstValueFrom } from 'rxjs';

await firstValueFrom(this.http.post<boolean>(`/someApi`))
  .then((value) => {
    console.log(`Result: ` + value);
  })
Run Code Online (Sandbox Code Playgroud)


Paw*_*rma 13

为什么会这样?

正如这里提到的,这些toPromise是被弃用的主要原因:

  1. 一个目标是将它从Observable原型中移除,并将其变成一个独立的 util 函数。

  2. 的命名toPromise不是最好的。特别是与await它结合使用时读起来不太好:await categories$.toPromise()vsawait lastValueFrom(categories$)

  3. 的类型信息toPromise错误。当源Observable完成而没有发出单个值时 - 它用undefined. 在这种情况下它应该拒绝。APromise是一个“承诺”,当它解析一个值时,它就会在那里——而且就是它 undefined。但是当流完成而从未发出值时,您无法区分undefined故意发出的流和完成而不再发出的流

接下来应该用什么?

如果你真的坚持按照承诺的方式去做,lastValueFrom/ firstValueFrom。否则切换到反应式编程将是要走的路。

这个链接应该有帮助-

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