Angular 2 Call Service только при инициализации приложения
Я пытаюсь вызвать внешний API только один раз для каждой инициализации приложения.
У меня простой сервис,
@Injectable()
export class XService {
url = "http://api.example.com"
constructor(private _http:Http) {
}
callAnAPI(){
console.log('made an external request");
return this._http.get(url)
.map(res=>res.json());
}
}
и два компонента, основной appComponent
@Component({
selector: 'my-app',
template: `
<div>
Test
</div>
`
})
export class AppComponent {
isLoading = true;
results = [];
constructor(private _service: XService){
}
ngOnInit(){
Observable.forkJoin(
this._service.callAnAPI()
// some more services here
)
.subscribe(
res => {
this.results = res[0];
},
null,
() => {this.isLoading = false}
);
}
}
и другой компонент, используемый с маршрутом
@Component({
template: `
<div>
I want to use the service with this component.
</div>
`
})
export class SecondComponent {
constructor(private _service: XService){
}
}
служба инициализируется и Angular обращается к серверу при инициализации AppComponent
, Я хочу использовать XService
с SecondComponent
Кроме того, всякий раз, когда я пытаюсь снова вызвать службу из SecondComponent
, (с помощью _service._service.callAnAPI()
) Angular бьет по внешнему API. Я хочу минимизировать внешние хиты.
Как получить данные, сделанные AppComponent
при инициализации, чем снова вызвать службу в SecondComponent
2 ответа
Вы могли бы использовать do
Оператор для этого получает данные в первый раз и повторно использует их для следующих вызовов:
@Injectable()
export class XService {
url = "http://api.example.com"
constructor(private _http:Http) {
}
callAnAPI(){
console.log('made an external request");
if (this.cachedData) {
return Observable.of(this.cachedData);
} else {
return this._http.get(url)
.map(res=>res.json())
.do((data) => {
this.cachedData = data;
});
}
}
}
Если вы хотите загрузить данные в качестве запуска, вы можете позвонить callAnAPI
метод из сервисного конструктора.
Чтобы использовать этот подход, вам нужно определить свой сервис при загрузке приложения:
bootstrap(AppComponent, [ XService ]);
Таким образом, вы будете использовать один экземпляр для всего вашего приложения.
@Injectable()
export class XService {
url = "http://api.example.com"
constructor(private _http:Http) {
}
callAnAPI(){
if(this.data) {
return Observable.of(this.data);
} else {
console.log('made an external request");
return this._http.get(url)
.map(res=>res.json())
.do(res => this.data = res);
}
}
}