2016-06-28 224 views
0

我不知道我是否應該爲此發佈任何代碼。但如果需要,我會。我有一個Angular2指令,MyDirective和一個服務MyService等待另一個observable繼續之前

該服務在其構造函數中進行http調用以獲取內容並存儲在說this.list中。

指令注入服務並將其用作myService.isPresent(item)

現在,問題是,執行時間指令時,用於獲取服務中列表的http調用未完成。有沒有一種乾淨的方式讓指令等到服務準備就緒?

回答

2

不,因爲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從一個工作示例

+0

但隨後這將導致多個http請求對嗎?我怎樣才能做出一個http請求,並防止所有後續的'loadData'調用忽略(但是在第一次調用完成後給它們回調) –

+0

因此,整個運行時的數據保持不變? – rinukkusu

+0

是的,它只是一個初始調用來獲取和緩存。可能有更好的方法? –

相關問題