2017-09-11 27 views
0

我在整個應用程序中使用可注入角度服務來提供日期。
此日期值取決於對服務器的http.get()請求。確保異步服務初始化完成?

constructor(...) 
{ 
    this.http.get(...).subscribe(r => { this.foo = r; }); 
} 

public getFoo() : Date 
{ 
    return Bar.dateFrom(this.foo); 
} 

有沒有什麼辦法可以確保請求已完成,由之前的服務提供給部件this.foo填充?
據我所知,我可以在任何地方返回Observable<Date>而不是.subscribe(),但這會使整個應用程序中許多地方的代碼更加複雜,可讀性更差,只能涵蓋一種極端情況/競爭條件。

有沒有其他方法可以確保我們最初等待請求返回?該應用程序不能在沒有其任何反正剩下的,所以我不會介意它是同步這裏...

回答

0

原來正確的方式做,這是包括在app.module.ts如下:

export function initConfig(foo: MyImportantService) 
{ 
     return() => 
     { 
     return foo.load(); 
     }; 
} 

@NgModule({ 
... 
    providers: 
     [ 
     ... 
     MyImportantService, 
     { provide: APP_INITIALIZER, useFactory: initConfig, deps: [MyImportantService], multi: true } 
     ... 
     ] 

,並讓您的服務實現一個load方法,如:

public load() : Promise<any> 
{ 
    this.http.get(...) 
    .map((res) => res.json()) 
    .toPromise() 
    .then((r) => { 
     this.importantVariable = r; 
    }); 
} 

這樣的APP_INITIALIZER將等待對於承諾在加載應用程序之前解決,您可以直接從服務中返回變量,而無需通過Observable。

0

在你的HTTP調用,

this.http.get(...).subscribe(
r => { this.foo = r; }, 
(error)=> console.log(error), 
()=> // call completed. Do something); 

在訂閱的第三個參數,您的http呼叫已完成,您可以在此完成呼叫後編寫您想要執行的操作的代碼。