2016-12-14 34 views
3

我需要在角度初始化之前先做两个HTTP调用。有什么方法可以同步初始化角度2吗?angular2 APP_INITIALIZER同步

请不要说我们的应用程序应该异步工作。 我正在使用“angular-cli”进行通用构建。首先,我需要获取在json文件中设置的环境,并基于我需要加载配置的环境。所以我需要两个HTTP调用。

{ 
provide: APP_INITIALIZER, 
    useFactory: (config: AppConfig) =>() => config.load(), 
    deps: [AppConfig], multi: true 
} 

内部负载()我有两个http调用其中一个,但在两个调用完成之前angular已初始化。

+0

会https://github.com/angular/angular/issues/9047#issuecomment-255597990的工作?小心:APP_INITIALIZER是实验性的:https://angular.io/docs/ts/latest/api/core/index/APP_INITIALIZER-let.html – Sebastian

+0

@Rohit你能检查我的答案吗? – DDRamone

回答

3

你是在一个正确的方式。 您可以将两个http调用转换为config.load()函数。

public load() { 
    return new Promise((resolve, reject) => { 
     this.http.get('first.json').map(res => res.json()).catch((error: any):any => { 

      console.error('Error at first call'); 

      resolve(error); 
      return Observable.throw(error.json().error || 'Server error'); 
     }).subscribe((firstResponse) => { 

      let request = this.http.get('second.json'); 

      request 
       .map(res => res.json()) 
       .catch((error: any) => { 
        console.error('Error at second call'); 
        resolve(error); 
        return Observable.throw(error.json().error || 'Server error'); 
       }) 
       .subscribe((secondResponse) => { 

        //Here i have both 
        firstResponse, secondResponse 

        resolve(true); 
       }); 

     }); 

    }); 
} 

考虑的是,功能和lambda表达式是不支持useFactory了,所以你必须重写它点点。还请确保您提供您的AppConfig

function initialConfigLoad(config: AppConfig) { 
    return() => config.load(); 
}; 

providers: [ 
    ... 
    AppConfig, // <- Provide AppConfig 
    { 
     provide: APP_INITIALIZER, 
     useFactory: initialConfigLoad, 
     deps: [AppConfig], 
     multi: true 
    } 
]