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
方法 return Observable<AxiosResponse<T>>
.
因此您可以将其转换为 Promise
然后在调用它时使用 await 或只是 return Observable
并让调用者处理它。
create(data): Promise<AxiosResponse> {
return this.httpService.post(url, data).toPromise();
^^^^^^^^^^^^^
}
请注意 return await
几乎(try catch 除外)总是多余的。
2022 年更新
toPromise
已弃用。相反,您可以使用 firstValueFrom
:
return firstValueFrom(this.httpService.post(url, data))
rxjs 库是最强大的并发包,它选择表单处理系统事件,如点击、外部请求,如获取数据或删除记录以及....
这个库背后的主要概念是:
handle data that receive in future
因此你在可观察对象中最常使用 3 个参数,例如
observablSource.subscribe(
data => { ... },
failure => { ... },
compelete => { ... }
)
但对于大多数 后端开发人员 使用来自 ECMAScript 6 feature 的 Promises并且是 JavaScript.
的原生部分
在 Angular 4+ and Nest.js 中默认使用支持 Observable 的 rxjs。在技术细节中,您可以找到将自动观察更改为承诺的解决方案。
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();
...
}
以下是工作代码的完整示例:
.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() ,但这样您就失去了可观察对象的功能,就像它能够通过添加重试操作符来为失败的 http 调用添加重试。
您可以自己实现此功能并创建自己的模块,或者只使用已经实现它的包,如下所示:https://www.npmjs.com/package/nestjs-http-promise
由于 toPromise()
已弃用,您可以将其替换为 firstValueFrom
或 lastValueFrom
例如:
const resp = await firstValueFrom(this.http.post(`http://localhost:3000/myApi`)
试试下面的这些,而不仅仅是 async-await。
弃用 toPromise 背后有一些基本原因。
我们知道 Promise 和 Observables 这两个集合都可能随着时间的推移产生价值。
其中 Observables return none 或更多并且 Promise return 成功解析时只有一个值。
看到的背后有一个主要原因
现在我们有 2 个新功能。
lastValueFrom : 当 Observable 完成更多 https://rxjs.dev/api/index/function/firstValueFrom
时到达的最后一个值
firstValueFrom:您可能希望在第一个值到达时获取第一个值,而无需等待 Observable 完成更多 https://rxjs.dev/api/index/function/lastValueFrom
如何使用 NestJs 在 HttpService
上使用 Async/Await?
以下代码不起作用:
async create(data) {
return await this.httpService.post(url, data);
}
HttpModule
使用 Observable
而不是 Promise
,后者不适用于 async/await。所有 HttpService
方法 return Observable<AxiosResponse<T>>
.
因此您可以将其转换为 Promise
然后在调用它时使用 await 或只是 return Observable
并让调用者处理它。
create(data): Promise<AxiosResponse> {
return this.httpService.post(url, data).toPromise();
^^^^^^^^^^^^^
}
请注意 return await
几乎(try catch 除外)总是多余的。
2022 年更新
toPromise
已弃用。相反,您可以使用 firstValueFrom
:
return firstValueFrom(this.httpService.post(url, data))
rxjs 库是最强大的并发包,它选择表单处理系统事件,如点击、外部请求,如获取数据或删除记录以及....
这个库背后的主要概念是:
handle data that receive in future
因此你在可观察对象中最常使用 3 个参数,例如
observablSource.subscribe(
data => { ... },
failure => { ... },
compelete => { ... }
)
但对于大多数 后端开发人员 使用来自 ECMAScript 6 feature 的 Promises并且是 JavaScript.
的原生部分在 Angular 4+ and Nest.js 中默认使用支持 Observable 的 rxjs。在技术细节中,您可以找到将自动观察更改为承诺的解决方案。
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();
...
}
以下是工作代码的完整示例:
.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() ,但这样您就失去了可观察对象的功能,就像它能够通过添加重试操作符来为失败的 http 调用添加重试。
您可以自己实现此功能并创建自己的模块,或者只使用已经实现它的包,如下所示:https://www.npmjs.com/package/nestjs-http-promise
由于 toPromise()
已弃用,您可以将其替换为 firstValueFrom
或 lastValueFrom
例如:
const resp = await firstValueFrom(this.http.post(`http://localhost:3000/myApi`)
试试下面的这些,而不仅仅是 async-await。
弃用 toPromise 背后有一些基本原因。
我们知道 Promise 和 Observables 这两个集合都可能随着时间的推移产生价值。 其中 Observables return none 或更多并且 Promise return 成功解析时只有一个值。
看到的背后有一个主要原因
现在我们有 2 个新功能。
lastValueFrom : 当 Observable 完成更多 https://rxjs.dev/api/index/function/firstValueFrom
时到达的最后一个值firstValueFrom:您可能希望在第一个值到达时获取第一个值,而无需等待 Observable 完成更多 https://rxjs.dev/api/index/function/lastValueFrom