私は、初期化が完了する前に非同期作業を行う必要があるAngular 2サービスを使用しています。Angular 2サービスの非同期初期化
@Injectable()
export class Api {
private user;
private storage;
constructor(private http: Http) {
this.storage = LocalStorage;
this.storage.get('user').then(json => {
if (json !== "") {
this.user = JSON.parse(json);
}
});
}
// one of many methods
public getSomethingFromServer() {
// make a http request that depends on this.user
}
}
現在のところ、このサービスは初期化されており、それを使用するコンポーネントにすぐに返されます。そのコンポーネントはngOnInit
のgetSomethingFromServer()
を呼び出しますが、その時点でApi.userは初期化されていないため、間違った要求が送信されます。
ライフサイクルフック(OnInit
、OnActivate
など)はサービスでは使用できません。コンポーネントとディレクティブのみで動作しないため、使用できません。
get()
からPromiseを保存するには、ユーザーがそれを待つためのさまざまな方法が必要となり、多くのコードの重複が発生します。
アンギュラ2でサービスを非同期初期化するにはどうすればよいですか?
ユーザーがLocalStorageに存在する場合はどうなりますか?毎回httpからそれを取得するつもりはありませんか? –
@MadHollander httpコールを実行する前にOPがサービスのブートストラップを待っていただけで、httpコールがユーザーを取得することはなく、事前にユーザーが解決する必要がある – dannrob