Сначала давайте попробуем понять разницу между Observable и Observer:
Кажется, что вы используете термины Observer и Observable взаимозаменяемо, что я не считаю правильнымчто нужно сделать.
Из этой статьи от Девиза Тодда :
Наблюдаемый : это простофункция, с несколькими особыми характеристиками.Это то, что он принимает «наблюдателя» (объект с методами «next
», «error
» и «complete
») и возвращает логику отмены.В RxJS это был бы объект Subscription с методом отписки.
Наблюдатель - это литерал объекта, который мы передаем в наш .subscribe()
(подписка вызовет нашу Observable).
Теперь давайте посмотрим, что говорит Angular StyleGuide:
Теперь, когда эта путаница устранена, давайте поговорим о том, что Руководство по стилю Angular скажем.
В нем подчеркивается Принцип единой ответственности :
Применить одиночныйпринцип ответственности (SRP) для всех компонентов, услуг и других символов.Это помогает сделать приложение чище, легче читать и поддерживать, а также более тестируемым.
Суть принципа единой ответственности заключается в том, что каждый кусок кода, который мы пишем, должен отвечать за один и JUST ONE задача.
Для компонента: это будет означать, что ответственность состоит в том, чтобы принимать пользовательские входные данные и показывать пользователю некоторые выходные данные.Теперь, что именно он показывает как вывод, и что именно он делает с вводом, на самом деле не является его ответственностью.
Для Службы: это будет означать, что ответственность заключается только вполучить входные данные от компонента и сделать что-то с ним.Кроме того, он отвечает за обращение к внешним источникам и получение данных, которые компонент должен отображать в представлении.
Возвращаясь к вашему примеру:
В идеале все, что получено от каких-либо методов в HttpClient, обычно возвращается как есть или после map
ping к Компоненту.Таким образом, использование subscribe
внутри метода Service не имеет особого смысла и должно рассматриваться как анти-шаблон.
Таким образом, ваш Service может быть реорганизован следующим образом:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class DataService {
constructor(private http: HttpClient) {}
...
postData(formData) {
return this.http.post('API', formData);
}
}
И этот сервис может быть использован в вашем Компоненте следующим образом:
import { Component } from '@angular/core';
import { DataService } from './data.service';
@Component({...})
export class YourComponent {
constructor(private dataService: DataService) {}
...
postData(formData) {
this.dataService.postData(formData)
.subscribe(response => /* DO SOMETHING WITH THE RESPONSE */);
}
}
PS: Я не говорю, что неправильно subscribe
- Observable
.Все, что я предлагаю, если данные являются чем-то, что будет использоваться как есть в компоненте, то Observable следует просто вернуть из метода Service и указать subscribe
d в компоненте.