簡體   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