不,因爲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
是的,它只是一個初始調用來獲取和緩存。可能有更好的方法? –