50

我正在尝试使用 APP_INITIALIZER 从配置文件加载数据。我收到以下错误:

“未处理的承诺拒绝:this.appInits[i] 不是函数;区域:;任务:Promise.then;值:TypeError:this.appInits[i] 不是函数”

代码:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Rx';

@Injectable()
export class ApiConfig {

  private urlList: any = null;

  constructor(private http: Http) {

  }

  public getUrl(key: any) {
    return this.urlList[key];
  }

  public loadConfig(){

    let retPromise: Promise<any> =  this.http.get('./assets/config/api-config.json')
      .map(res => res.json()).toPromise();

    retPromise.then(resp => this.urlList=resp.urlList);
    //this.urlList = retPromise.urlList;

    return retPromise;
  }

}


export  function apiConfigProvider(config: ApiConfig) {
   config.loadConfig();
}

对我做错了什么有帮助吗?

编辑:

亚当的解决方案修复了最初的错误。但现在我看到一个新错误:

TypeError:无法设置未定义的属性“urlList”

据我了解,没有创建 ApiConfig 实例。但是我在 Angular 中加载配置文件时看到的所有示例都给出了相同的示例。我想知道如何强制创建 ApiConfig 类。以及如何使它成为单例?下面是 ApiConfig 的用法。

export BaseService { 
constructor (private config:ApiConfig){} 

public GetUrl (key: string) { 
   return config.urlList[key]; 
} 

}

答: 上面代码中创建承诺的方式似乎存在问题。我修改了链接中给出的 loadconfig() 方法:https ://gist.github.com/fernandohu/122e88c3bcd210bbe41c608c36306db9这解决了我的问题。

4

1 回答 1

90

我认为这是因为您需要在导出函数语句中返回该函数:

export function apiConfigProvider(config: ApiConfig) {
   return () => config.loadConfig();
}
于 2017-09-06T13:24:17.090 回答