web-dev-qa-db-ja.com

「this.appInits [i]」は関数ではありません

APP_INITIALIZERを使用して、構成ファイルからデータをロードしようとしています。私は次のエラーが発生しています:

「処理されていないPromiseの拒否: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();
}

私が間違っていることの助けはありますか?

編集:

Adamのソリューションは元のエラーを修正しました。しかし、今、新しいエラーが表示されます:

TypeError:未定義のプロパティ「urlList」を設定できません

私が理解したように、ApiConfigのインスタンスは作成されていません。しかし、Angularの設定ファイルをロードする際に見たすべての例は、同じ例を示します。ApiConfigクラスを強制的に作成する方法を疑問に思います。どうすればそれをシングルトンにできますか? ApiConfigの。

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

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

}

Answer:上記のコードでpromiseを作成する方法に問題があるようです。リンクで指定されているようにloadconfig()メソッドを変更しました: https://Gist.github.com/fernandohu/122e88c3bcd210bbe41c608c36306db9 これで問題が解決しました。

17
Rakesh

これは、エクスポート関数ステートメントで関数を返す必要があるためだと思います。

export function apiConfigProvider(config: ApiConfig) {
   return () => config.loadConfig();
}
41
Adam