私は特定のデータへのアクセスを提供するAngular 4サービスを構築しています。このサービスが最初に をインスタンス化するときは、非同期プロセスであるデータストアへの接続を確立する必要があります。アングル4サービス:どのように非同期initプロセスを実装できますか?
は、どのように私は最高のこの非同期接続処理が完了する前にサービスを利用しようとするから(すなわち、コンポーネントやその他のサービス)このサービスの消費者を防ぐことができますか?
私のサービスが、この約束が解決するのを待つように、アンジェラのブートストラップに指示する方法はありますか?
サービスは、providers
の配列に登録されています。 (私が理解しているように)Angularはサービスの単一インスタンスを構築し、MyService
を注入するコンポーネントやサービスに提供されます。
明確にするために、ここで私が怖いシナリオです:アプリケーションのブートストラッププロセス中に
は、角度は、モジュールの
providers
配列でMyService
を見て、そのコンストラクタを呼び出します。MyService
のコンストラクタが接続プロセスを開始します。接続プロセスは2〜3秒かかる場合があります。一方、Angularのブートストラップは先に充電を続け、アプリケーションのダッシュボードをレンダリングします。
ダッシュボードコンポーネントは
MyService
を注入し、(それ自身のコンストラクタで、又はおそらくngOnInit
で)接続が確立される前myService.getData()
を呼び出そう。説明するために
、ここでは、このサービスは次のようになります。あなたの接続が確立されるまで、あなたが何をする必要があるか
import { Injectable } from '@angular/core';
@Injectable()
export class MyService {
private connection;
constructor() {
this.connect().then((connection) => {
this.connection = connection;
// Components should be able to consume this service once execution reaches this point, but not before!
});
}
private connect(): Promise<any> {
// (return some promise which will eventually resolve with a connection)
}
public getData(key: string): string {
// (this method won't be usable until the .then() in the constructor has run)
}
}
なぜ、getData()から約束またはObservableを返さないのですか?それはおそらくあなたがどうにかしなければならないことでしょう。なぜなら、私は接続を使ってデータストアからデータを取得することが、非同期になることを推測しているからです。 –
それはいい考えです、それはやるべきことかもしれません。実際、データアクセスは非同期ではありません(驚くほど十分です)。だから私が上記のことをやる方法があれば、データアクセスロジックをもっとシンプルに保つことが望ましいでしょう。アイデアをありがとう。 – greenie2600
私はフレームワークレベルでそういうものを認識していません。しかし、ルーターを使用して親ルートに解決策を追加することで、ルーターが約束が満たされるまでサブ・ルートをナビゲートすることを防ぐことができます。 –