Если вы наклоняетесь в наблюдаемые в качестве средства обмена данных, вы можете принять следующий подход:
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable, ReplaySubject } from 'rxjs';
@Injectable()
export class CachedService {
data$: Observable<Response> = this.dataSubject.asObservable();
private dataSubject = new ReplaySubject<Response>(1);
constructor(private http: Http) { }
fetch() {
this.http.get(...).subscribe(res => this.dataSubject.next(res));
}
}
Это будет сделать вызов HTTP, когда метод fetch
называется, и любые абоненты service.data$
получит ответ от ReplaySubject
. По мере того, как он повторяет более ранние значения, любые абоненты, которые присоединяются к после, разрешает вызов HTTP-запроса, все равно получит предыдущий ответ.
Если вы хотите вызвать обновление, вы можете просто позвонить service.fetch()
, чтобы начать новый HTTP-вызов, и все подписчики будут обновлены после поступления нового ответа.
Ваши компоненты будут выглядеть примерно так:
@Component({ ... })
export class SomeComponent implements OnInit {
constructor(private service: CachedService) { }
ngOnInit() {
this.service.fetch();
this.service.data$.subscribe(...);
}
}
Я недавно написал статью в блоге на этом подходе для моих коллег: http://blog.jonrshar.pe/2017/Apr/09/async-angular-data.html
Wheres ваши предыдущие коды? – aimme