首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rxjs toPromise()

Rxjs toPromise()
EN

Stack Overflow用户
提问于 2021-04-11 11:11:55
回答 3查看 38.1K关注 0票数 42

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-11 11:19:06

为什么会发生这种事?

正如前面提到的这里,这些是反对toPromise的主要原因:

  1. 其中一个目标是将其从Observable原型中删除,并将其转换为独立的util函数。
  2. toPromise的命名并不是最好的。特别是与await结合使用时,它读起来不太好:await categories$.toPromise() vs await lastValueFrom(categories$)
  3. toPromise的类型信息错误。当源Observable完成时,没有发出一个值--它用undefined进行了解析。在这种情况下,它应予以拒绝。Promise是一种“承诺”,当它解析时,一个值就会出现--并且是undefined。但是,当流完成而不发出值时,您就无法区分一个有意发出undefined的流和一个没有发出任何消息的流。

您下一步应该使用什么?

如果你真的坚持用承诺的方式去做,lastValueFrom/firstValueFrom。否则,切换到反应性编程将是一条路。

使用toPromise (不推荐)-

代码语言:javascript
复制
public async loadCategories() {
    this.categories = await this.inventoryService
      .getCategories()
      .toPromise()
}

使用lastValueFrom (新)-

代码语言:javascript
复制
import { lastValueFrom } from 'rxjs';

public async loadCategories() {
    const categories$ = this.inventoryService.getCategories();
    this.categories = await lastValueFrom(categories$);
} 

这种联系应该有帮助-

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

票数 55
EN

Stack Overflow用户

发布于 2021-09-16 22:32:44

firstValueFromlastValueFrom无疑是一个更好的选择,原因有很多:

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

有关此问题的更多信息,请参阅下面的视频:

https://www.youtube.com/watch?v=3aeK5SfWBSU

票数 18
EN

Stack Overflow用户

发布于 2022-08-14 14:07:15

代码示例:

废弃用途:

代码语言:javascript
复制
await this.http.post<boolean>(`/someApi`).toPromise()
  .then((value) => {
    console.log(`Result: ` + value);
  })

新代码:

代码语言:javascript
复制
import { firstValueFrom } from 'rxjs';

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

)

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67044273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档