У меня есть служба Angular, в которой я получаю данные из бэкэнда.Теперь внутри этого сервиса у меня есть переменная типа ReplaySubject
.Я подписываю эту переменную ReplaySubject
на мой component
.
Мой код
@Injectable()
export class PersonService {
// The person subject
personStream: ReplaySubject<Person> = new ReplaySubject();
// Get person from DB and add to stream
getDataFromDB() {
this.http.get(url).subscribe(response => {
this.personStream.next(response.person);
});
}
}
@Component({...})
export class MyComponent implements OnInit {
person: Person;
constructor(private personService: PersonService) {}
ngOnInit() {
this.personService.personStream.subscribe(person => this.person = person);
}
}
Этот код работает нормально, но у меня есть сомнения.Я видел код, который немного отличается от этого подхода.Другой способ подписки ReplaySubject
- создать в службе новую функцию типа Observable
, и внутри компонента подписаться на эту функцию вместо прямой подписки на ReplaySubject
.
Пример
@Injectable()
export class PersonService {
// The person subject
personStream: ReplaySubject<Person> = new ReplaySubject();
// The person observable
person$(): Observable<Person> {
return this.personStream.asObservable();
}
// Get person from DB and add to stream
getDataFromDB() {
this.http.get(url).subscribe(response => {
this.personStream.next(response.person);
});
}
}
@Component({...})
export class MyComponent implements OnInit {
person: Person;
constructor(private personService: PersonService) {}
ngOnInit() {
// Subscribe to person observable. Any time person data changes, this will be called.
this.personService.person$().subscribe(person => this.person = person);
}
}
Я знаю, как будет работать код, но я хочу знать лучший и эффективный способ сделать это.
Спасибо.