我要完成的是每次应用程序初始化仅调用一次外部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
中再次调用服务
您可以使用 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);
}
}
}