如何嵌套包装在APP_INITIALIZER中的httpclient调用

时间:2018-11-15 13:04:56

标签: angular typescript httpclient

我已经实现了一个由APP_INITIALIZER触发的httpCall,它返回一个URL,然后我想将其用于另一个嵌套的httpCall:

getAppSettings(): Observable<IAppSettings> {
    return (this.httpClient
        .get<IAppSettings>(this.localbaseUrl)
        .pipe(
            catchError(this.errorHandlerSerevice.handleError)
        )) as any;
}

getConfigValues(): Promise<void> {
    return this.getAppSettings()
        .toPromise()
        .then(data => {
            this.exampleUrl = data;
            this.getOtherStuff().subscribe(data => this.stuff = data);
        });
}

getOtherStuff(): Observable<any[]> {
    return (this.httpClient
        .get<any[]>(this.exampleUrl)
        .pipe(
            catchError(this.errorHandlerSerevice.handleError)
        )) as any;
}

此实现是错误的,在刷新页面时会引发以下错误:

 Uncaught (in promise): TypeError: Cannot read property 'length' of undefined

来自this.stuff []的

没有及时填充(第二个,嵌套的httpClient可观察调用)。

如何正确实现/嵌套这些httpClient调用。 请注意,我使用Angular 6和httpClient,请不要建议旧的http get解决方案。

1 个答案:

答案 0 :(得分:0)

原来,您不能在由APP_INITIALIZER初始化的Promise中嵌套Observable。嵌套调用也必须是Promise。请参阅修改后的方法,该方法现在可以正确分配this.stuff:

GoogleAnalyticsSwift