繁体   English   中英

NestJs 异步 httpService 调用

[英]NestJs async httpService call

如何使用 NestJs 在HttpService上使用 Async/Await? 以下代码不起作用:

async create(data) {
    return await this.httpService.post(url, data);
}

HttpModule使用Observable而不是Promise ,它不适用于 async/await。 所有HttpService方法都返回Observable<AxiosResponse<T>>

因此,您可以将其转换为Promise ,然后在调用它时使用 await,或者只返回Observable并让调用者处理它。

create(data): Promise<AxiosResponse> {
    return this.httpService.post(url, data).toPromise();
                                           ^^^^^^^^^^^^^
}

请注意, return await几乎(除了 try catch)总是多余的。

2022 年更新

toPromise已弃用。 相反,您可以使用firstValueFrom

import { firstValueFrom } from 'rxjs';

// ...

return firstValueFrom(this.httpService.post(url, data))

由于toPromise()已被弃用,您可以将其替换为firstValueFromlastValueFrom

例如:

const resp = await firstValueFrom(this.http.post(`http://localhost:3000/myApi`)

https://rxjs.dev/deprecations/to-promise

rxjs 库是最强大的并发包,它选择表单处理系统事件(如点击)、外部请求(如获取数据或删除记录)和....

这个库背后的主要概念是:

处理将来接收的数据

因此,您最常在可观察对象中使用 3 个参数,例如

observablSource.subscribe(
   data => { ... },
   failure => { ... },
   compelete => { ... }
)

但是对于大多数后端开发人员来说,使用来自ECMAScript 6 特性并且是 JavaScript 的本机部分的Promises

默认情况下, Angular 4+Nest.js使用支持Observablerxjs 在技​​术细节中,您可以找到将可观察到的自动更改为承诺的解决方案。

const data: Observable<any>;
data.from([
   {
      id: 1,
      name: 'mahdi'
   }, 
   {
      id: 2,
      name: 'reza'
   },
 ])

现在您已经模拟了来自服务器的可观察类型的请求。 如果要将其转换为Pormise ,请使用链式方法,例如:

   data.toPromise();

从这一步开始,您已经承诺使用它更好地附加async/await的对象和表单

 async userList( URL: string | URLPattern ) {
    const userList = await this.http.get<any>( URL ).toPromise();
    ...
 }

试试下面的这些,而不是仅仅 async-await。

弃用 toPromise 背后有一些基本原因。

我们知道 Promise 和 Observables 这两个集合都可能随着时间的推移产生价值。 其中 Observables 不返回或返回更多,而 Promise 在解析成功时只返回一个值。

看到的背后有一个主要原因

现在我们有 2 个新功能。

以下是工作代码的完整示例:

.toPromise() 实际上是缺失的

async getAuthToken() {
    const payload = {
      "SCOPE": this.configService.get<string>('SCOPE'),
      "EMAIL_ID": this.configService.get<string>('EMAIL_ID'),
      "PASSWORD": this.configService.get<string>('PASSWORD'),
    };
    const url = this.configService.get<string>('AUTHTOKEN_URL')
    const response = await this.httpService.post(
      url,
      payload
    ).toPromise();
    console.log(response.data);
    return response.data;
  }

你可以在每个方法调用的末尾添加 .toPromise() ,但是你失去了 observables 的力量,就像它能够通过添加重试运算符来为失败的 http 调用添加重试。

您可以自己实现此功能并创建自己的模块,或者只使用已经实现它的包,如下所示: https ://www.npmjs.com/package/nestjs-http-promise

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM