不,因为http调用总是异步的,所以不能同步等待它们。
然而,您可以自己实例化服务并使用ReflectiveInjector
,并在引导应用程序之前调用初始化以确保所有内容都已加载。
在bootstrap
调用只需提供您的MyService
实例与数据。
//import ... from ...
import {MyService} from './my.service';
let injector = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS, MyService]);
var myService: MyService = injector.get(MyService);
myService.init()
.subscribe(data => {
bootstrap(App, [
HTTP_PROVIDERS,
provide(MyService, {useValue: myService})
])
.catch(err => console.error("error: ", err));
});
在你MyService
添加此init
方法返回一个Observable
为您的数据加载:
init(): Observable<any> {
if (!this._initialized) {
this._initialized = true;
return this._http.get(this._url)
.map(data => {
this._data = data.json();
return this._data;
});
}
else {
console.log("Already initialized!");
}
}
Plunker从一个工作示例
但随后这将导致多个http请求对吗?我怎样才能做出一个http请求,并防止所有后续的'loadData'调用忽略(但是在第一次调用完成后给它们回调) –
因此,整个运行时的数据保持不变? – rinukkusu
是的,它只是一个初始调用来获取和缓存。可能有更好的方法? –