angular RXJS 如何转换订阅响应类型
angular RXJS how to cast subscribe response type
我编写了后端,因此我准确地知道从我的控制器返回的数据 (DTO) 的格式。
当我执行 post 时:
await this.http.post(this.baseUrl + 'account/login', dto).subscribe(
(response) => {
如果尝试指定响应:例如 UserDto,我会收到错误消息:
我也尝试过将响应强制转换为另一个 UserDto 类型的变量,但同样失败。我不记得以前有过这个问题(比如早期的 Angular 版本??)。
这必须很简单 - 我很抱歉不明白如何去做。
仅供参考:ng 版本 12.1.1
提前致谢。
查克
subscribe()
方法 returns 你不能等待的 RxJS Subscription
对象实例。您只能等待 Promise,因此您需要将 Observable 转换为 Promise:
await response = await this.http.post(this.baseUrl + 'account/login', dto).toPromise();
注意,在 RxJS 8 中 toPromise()
将被两个方法 firstValueFrom()
和 lastValueFrom()
取代。
通过使用 post
方法的非通用形式,您将获得 Observable<HttpResponse>
的响应类型。因此,除非您自己通过管道和映射响应,否则您订阅中的响应将是 HttpResponse
类型,因此您必须从 HttpResponse
.
获取正文
this.http.post(this.baseUrl + 'account/login', dto).subscribe(
(response: HttpResponse) => {
const userDto: UserDto = response.body as UserDto
}
);
或者,您可以使用 post
方法的通用形式,该方法将采用要映射到的类型...
this.http.post<UserDto>(this.baseUrl + 'account/login', dto).subscribe(
(response: UserDto) => {
// The response is already map and typed to your UserDto.
}
);
我编写了后端,因此我准确地知道从我的控制器返回的数据 (DTO) 的格式。 当我执行 post 时:
await this.http.post(this.baseUrl + 'account/login', dto).subscribe(
(response) => {
如果尝试指定响应:例如 UserDto,我会收到错误消息:
我也尝试过将响应强制转换为另一个 UserDto 类型的变量,但同样失败。我不记得以前有过这个问题(比如早期的 Angular 版本??)。
这必须很简单 - 我很抱歉不明白如何去做。 仅供参考:ng 版本 12.1.1
提前致谢。 查克
subscribe()
方法 returns 你不能等待的 RxJS Subscription
对象实例。您只能等待 Promise,因此您需要将 Observable 转换为 Promise:
await response = await this.http.post(this.baseUrl + 'account/login', dto).toPromise();
注意,在 RxJS 8 中 toPromise()
将被两个方法 firstValueFrom()
和 lastValueFrom()
取代。
通过使用 post
方法的非通用形式,您将获得 Observable<HttpResponse>
的响应类型。因此,除非您自己通过管道和映射响应,否则您订阅中的响应将是 HttpResponse
类型,因此您必须从 HttpResponse
.
this.http.post(this.baseUrl + 'account/login', dto).subscribe(
(response: HttpResponse) => {
const userDto: UserDto = response.body as UserDto
}
);
或者,您可以使用 post
方法的通用形式,该方法将采用要映射到的类型...
this.http.post<UserDto>(this.baseUrl + 'account/login', dto).subscribe(
(response: UserDto) => {
// The response is already map and typed to your UserDto.
}
);