在 promise 请求中使用 async/await 是不是更有效? [关闭]

Posted

技术标签:

【中文标题】在 promise 请求中使用 async/await 是不是更有效? [关闭]【英文标题】:Is using async/await in promise request more efficient? [closed]在 promise 请求中使用 async/await 是否更有效? [关闭] 【发布时间】:2022-01-11 06:40:16 【问题描述】:

提出请求的最佳方式是什么?

我在project.service.ts 中有一个http request 方法。我可以使用以下结构提出请求:

getProjectById(projectId: number) 
  return this.http.get<Project>(`$this.url/search/projects/$projectId`).toPromise();

并在project.component.ts 中使用以下结构调用它:

async getProject(projectId: number) 
  this.isLoading = true;
  try 
    this.project = await this.api.projects.getProjectById(projectId);
   finally 
    this.isLoading = true;
  

但我也可以这样提出请求:

async getProjectById(projectId: number) 
  return await this.http.get<Project>(`$this.url/search/projects/$projectId`).toPromise();

或者这个:

getProjectById(projectId: number): Observable<Project> 
  return this.http.get<Project>(`$this.url/search/project/$projectId`);

但我必须subscribe 才能使用此功能。

【问题讨论】:

您的第二个getProjectById sn-p(带有async 关键字)与第一个sn-p 的工作方式完全相同,那么为什么还要让它变得更复杂呢? @Bergi 我只想知道它们之间的区别。例如,如果我使用第二个getProjectById,是否仍然需要在我的project.component.ts 中使用异步?还是通过第一种带有异步功能的方法更好? @Bergi 不仅如此,使用Observables 更好吗? 简短回答 async await 是 promise 的语法糖,没有任何改变,它们在幕后的工作方式完全相同 @RobertodeLeón 没有区别。它仍然返回项目响应的承诺,是的,您仍然必须使用getProject 中的await 处理它。至于 observables 与 promises,这是非常基于意见的,之前也是 has been asked multiple times。 【参考方案1】:

这与其说是效率问题,不如说是代码设计和代码整洁的问题。 我认为遵循 Angular 内置 Http 模块的指南。

您需要保持代码干净,并遵循 RxJS 流程,而不是将其转换为异步代码。

所以你需要使用这个:

getProjectById(projectId: number): Observable<Project> 
  return this.http.get<Project>(`$this.url/search/project/$projectId`);

如果你没有理由,不要把它复杂化。

【讨论】:

我不使用Observables 的一个例子是,在应用程序流中,第二个请求在第一个请求之前到达API,这导致覆盖新信息。 我曾因在 Angular 上使用 Promises 而被枪杀几次。在我看来,如果你的数据没有改变,我会承诺。但是,如果数据发生变化(例如,从使用 Websocket 获取实时数据的 API 请求),Observable 是要走的路,如果不是,Promises。再次......我的拙见。 @RobertodeLeón 我不完全明白你的意思,因为 RxJS 是一个安静的大库,有很多选择。请注意,你有管道——还有像 Merge 这样的东西

以上是关于在 promise 请求中使用 async/await 是不是更有效? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

进阶篇:以IL为剑,直指async/await

在 promise 请求中使用 async/await 是不是更有效? [关闭]

在vue中使用Promise

是否可以在 MVC 4 AuthorizeAttribute 中使用异步/等待?

在不用Promise的情况下如何控制异步请求?

使用Promise.race实现超时机制取消XHR请求