угловой: HttpClient map response
В настоящее время я переключаюсь с http (@angular/http) на HttpClient (@angular/common/http) и имеет проблемы с отображением моего ответа на объекты.
Старый код (работал до этого)
this.http.get(environment.baseUrl + '/api/timeslots')
.map((response: Response) => {
const data = response.json();
const timeslots = Array.of<Timeslot>();
for (const item of data) {...}
Новый код, но ошибка компиляции:
this.httpClient.get(environment.baseUrl + '/api/timeslots')
.map((response: Response) => {
const data = <Timeslot[]> response;
const timeslots = Array.of<Timeslot>();
for (const item of data) {...}
Я скучаю по актерскому составу? Ответ - это массив Timeslots.
Ответы
Ответ 1
Значение по умолчанию, возвращающее новый HttpClient, - Object. Он автоматически вызывает response.json()
внутренне.
Вы можете указать HttpClient, какой тип ответа будет, так что:
this.httpClient.get<Timeslot[]>(...)
.map((timeSlots) => {
...
где тип timeSlots
будет timeSlots
Timeslot[]
Дополнительная информация о typecheking в новом HttpClient
Ответ 2
Вы все еще можете, но вам нужно импортировать map()
-operator из rxjs следующим образом:
import 'rxjs/add/operator/map';
И у вас будет оператор map()
.
(См. Также мой ответ здесь: fooobar.com/questions/848097/...)
Ответ 3
Начиная с Angular 6/7 было несколько изменений в реализации библиотеки RxJS в Angular.
Следовательно, операторы RxJS теперь расположены в "rxjs/operator" вместо "rxjs/add/operator/: OperatorName". Кроме того, эти операторы больше не могут быть напрямую связаны с наблюдением, вместо этого они должны быть связаны с помощью метода pipe().
Итак, новый способ реализации этого должен выглядеть следующим образом:
import {map} from 'rxjs/operators';
this.http.get(...)
.pipe(
map( response => {
// TODO: Do Your Staff Here!
} )
);
Пожалуйста, обратитесь к конкретной угловой документации здесь для более подробной информации. * Здесь я предполагаю, что ваш компонент HttpClient
доступен по this.http
.