Объект Observable и библиотека RxJS¶
Методы класса HttpClient
после выполнения запроса возвращают объект Observable<any>
, который определен в библиотеке RxJS ("Reactive Extensions"). Она не является непосредственно частью Angular, однако широко используется особенно при взаимодействии с сервером по http. Эта библиотека реализует паттерн "асинхронный наблюдатель" (asynchronous observable). Так, выполнение запроса к серверу с помощью класса HttpClient
выполняются в асинхронном режиме.
Естественно чтобы задействовать функционал RxJS в приложении, в проект должна быть добавлена соответствующая зависимость rxjs
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Используя специальные методы для объекта Observable
, например, map
и filter
, можно произвести некоторую постобработку полученных от сервера результатов.
Так, возьмем проект из прошлой темы:
Например, определим в файле users.json
данные, которые напрямую не соответствуют массиву объектов User
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
В качестве модели данных используем класс User
:
1 2 3 4 |
|
Определим следующий код сервиса, который будет получать данные из users.json
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Смысл использования специального сервиса для работы с http заключается в сокрытии деталей отправки запросов. Компонент же ожидает получить какие-то конкретные данные, например, в виде набора объектов User
. С помощью метода map
библиотеки rxjs
можно преобразовать данные из одного формата в другой.
У результата метода get()
мы можем вызвать метод pipe()
, который позволяет обработать результаты запроса. Для этого метод pipe
в качестве первого параметра принимает функцию обработки данных запроса. В данном случае в роли такой функции выступает оператор map
, который преобразует результаты запроса в новые объекты.
Но чтобы использовать элементы библиотеки RxJS, их надо импортировать:
1 2 |
|
В итоге весь метод getUsers()
возвращает объект Observable<User[]>
.
Теперь используем сервис в классе компонента:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|