[解決済み] Angularのasync/await `ngOnInit` について
質問
私は現在、Angularのresp.RxJSを置き換えることの長所と短所を評価しています。
Observable
をプレーンな
Promise
を使用できるように
async
と
await
を追加し、より直感的なコードスタイルを得ることができます。
私たちの典型的なシナリオの一つです。あるデータを
ngOnInit
. 使用方法
Observables
を使えば、そうなります。
ngOnInit () {
this.service.getData().subscribe(data => {
this.data = this.modifyMyData(data);
});
}
を返すと
Promise
から
getData()
を使用し、代わりに
async
と
await
となる。
async ngOnInit () {
const data = await this.service.getData();
this.data = this.modifyMyData(data);
}
さて、明らかに、Angularは、その
ngOnInit
が
async
. これは問題ないと思っています:私のアプリは以前と同じように動作します。しかし
OnInit
インターフェイスを見ると、この関数は明らかにそのように宣言されていません。
async
:
ngOnInit(): void;
では -- 要するに。私がここでやっていることは妥当でしょうか?それとも、予期せぬ問題にぶつかるのでしょうか?
どのように解決するのですか?
今までと何ら変わりはありません。
ngOnInit
はPromiseを返し、呼び出し側はそのPromiseを無視します。 これは、呼び出し側がメソッド内のすべてが終了するのを待たずに処理を進めることを意味します。 この具体的なケースでは、ビューの設定が終了し、ビューが起動する前に
this.data
が設定される前にビューが起動されるかもしれないことを意味します。
これは、以前と同じ状況です。 呼び出し側はサブスクリプションが終了するのを待たず、おそらくアプリを起動する前に
this.data
が入力される前にアプリを起動する可能性があります。 ビューが
data
に依存しているのなら、おそらく何らかの
ngIf
を設定し、アクセスできないようにしている可能性があります。
個人的には、その意味を理解している限り、厄介だとか悪い習慣だとは思っていません。 しかし
ngIf
は面倒です (どちらの方法でも必要でしょう)。 私は個人的に、この状況を回避できるように、意味のあるところではルートリゾルバを使用するように移行しました。 ルートがナビゲーションを終了する前にデータがロードされ、ビューがロードされる前にデータが利用可能であることを知ることができます。
関連
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] コンストラクタとngOnInitの違いについて
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] Angular HTMLバインディング
-
[解決済み] Angular/RxJS `Subscription` からいつ退会すればいいのか?
-
[解決済み] 非同期アロー関数のシンタックス
-
[解決済み] async/await関数を並列に呼び出す
-
[解決済み] async/await - タスクとvoidをいつ返すか?
-
[解決済み] async/await構文で拒否する方法は?
-
[解決済み】Array.mapで非同期awaitを使用する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PromiseとObservablesの違いは何ですか?
-
[解決済み] Angular2でNgForがPipeでデータを更新しない。
-
[解決済み] Angular 4+ ngOnDestroy() サービス中 - observableを破壊する
-
[解決済み] 簡単なパイプで小数点以下2桁に制限する
-
[解決済み] Angular / Angular Materialでmat-horizontal-stepperのステップをプログラムで移動させることは可能ですか?
-
[解決済み] Angular2 bodyタグにクラスを追加する
-
[解決済み] 遅延のあるobservableを作成するには?
-
[解決済み] Angular 2で送信後にフォームをクリアするには?
-
[解決済み] 角度の2つのスイッチケース値
-
[解決済み] 角度換算2