#angular #rxjs #subscribe
Вопрос:
Я написал серверную часть, поэтому я точно знаю формат данных (DTO), которые возвращаются с моего контроллера. Когда я выполняю такой пост, как:
await this.http.post(this.baseUrl 'account/login', dto).subscribe(
(response) => {
если попытаться указать ответ: например, UserDTO, я получу ошибку:
Я также попытался привести ответ к другой переменной типа UserDTO, но это также не удается. Я не могу вспомнить, чтобы у меня была эта проблема раньше (например, более ранние угловые версии??).
Это должно быть просто — мои извинения за то, что я не понимаю, как это сделать. к вашему сведению: версия ng 12.1.1
Заранее спасибо. Зажимной патрон
Комментарии:
1. Вы могли бы использовать общий пост.
this.http.post<UserDto>(this.baseUrl 'account/login', dto)
Ответ №1:
Используя нестандартную форму 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.
}
);
Ответ №2:
subscribe()
метод возвращает экземпляр объекта RxJS Subscription
, которого вы не можете дождаться. Вы можете ждать только обещаний, поэтому вам нужно преобразовать наблюдаемое в обещание:
await response = await this.http.post(this.baseUrl 'account/login', dto).toPromise();
Обратите внимание, что в RxJS 8 toPromise()
будут заменены два метода firstValueFrom()
и lastValueFrom()
.