gpt4 book ai didi

仅在应用程序初始化时使用 Angular 2 调用服务

转载 作者:太空狗 更新时间:2023-10-29 17:48:57 31 4
gpt4 key购买 nike

我想要完成的是每次应用程序初始化只调用一次外部 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 初始化时访问服务器。我也想将 XServiceSecondComponent 一起使用,每当我尝试从 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 ]);

这样,您将为整个应用程序使用单个实例。

关于仅在应用程序初始化时使用 Angular 2 调用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36083114/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com