teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

概要を箇条書きで補足。

2016/10/13 06:50

投稿

timy
timy

スコア168

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,19 @@
1
+ ### 概要(追記)
2
+ わかりにくかったので箇条書きします。
3
+ - Angular の Http モジュールでWeb APIを叩く。結果は Observable=非同期処理。
4
+ - ログイン情報などはログイン中不変なので、一度得たAPI結果を保持して以後それを参照したい。
5
+ - javascript でオブジェクトのプロパティを参照するような処理は当然ながら同期処理である
6
+ - Angular フレームワークのフロー上、非同期なAPIの結果が返る(非同期)より先に結果を参照する(同期)処理が実行されうる。
7
+ - そこでどうするか?
8
+ - 現状はAPIの実行状態(完了/未完了)をコンポーネントからチェックできるフラグを用意し、Angular の状態変更監視イベント ngDoCheck のリスナーで「APIが完了状態になったら値を取得してコンポーネントに渡す」処理をしている。
9
+ - よりシンプルな構造にする案は以下いくつか考えられるが具体的な実装がわからない。
10
+ - 案1:同期処理に合わせる= APIの結果が返るまで他の処理を全て中止して待機(Angular と Observable の構造で可能?)
11
+ - 案2:非同期処理に合わせる=参照側にはObservableを返すが内部的にはサーバAPIを一度しか実行しない(……どうやって?)
12
+ - 案2B: 諦めて毎回APIを叩く。Webサーバ側でオーバーヘッドを減らすことを考えるべき?
13
+ - 上記いずれかの実装方法、あるいは他の改善案は考えられますでしょうか。
14
+
15
+ ---
16
+
1
17
  標記の環境で、アプリケーションへのログイン時、ルートコンポーネントの初期化処理で、DIしたserviceクラスからサーバAPI(Http)をコールしてカレントユーザ情報などを取得して service インスタンスのプロパティに持ち、以後そのインスタンスを各コンポーネントにDIして持ち回り参照したい。
2
18
  ```TypeScript
3
19
  export class AppComponent implements OnInit, DoCheck {