2017-04-15 7 views
0

私は、興味深いジレンマを持っています。私はangle2アプリを構築しており、RXjs観測可能なデータストアを使用してデータをアプリに送ります。つまり、起動時に、ユーザーがログインしている場合、アプリリゾルバーはログインしているユーザーデータを角度で取得して店舗にプッシュし、そのデータをアプリ内のログインしたユーザーだけが見ることができる部分に送ります。これは、たとえば、ユーザーが認証されたJWTトークンがストア内に存在することを意味します。RXjsを含むAngular2ネストされたリゾルバは競合条件を格納します

ルーティング例えば

{ 
    path: '', 
    resolve: { 
     _: AppResolverService 
    }, 
    children: [ 
     path: 'subnav', 
     resolve: { 
      _: SubnavResolverService 
     } 
    ] 
} 

ユーザは、次にログインしている場合、前記

AppResolverService

、レゾルバがネストされている方法を確認しJWTトークンおよび他のユーザデータを取得し、セッションに送信しますストアデータサービス。それ以外の場合、ユーザーはログインにリダイレクトされます。

コード例:

let ret = this._dashboardOrchestrationService.getUserListings( 
    this._sessionStoreService.loggedInUserLastValue.id 
); 

セッションストア

は、セッションストアデータサービス

コード例からユーザーの資格情報を取得し

let resolverObservable = this._sharedOrchestrationService.getLoggedInUser(); 
resolverObservable 
    .subscribe((res:UserModel) => { 
     this._sessionStoreService.setLoggedInUser(res) 
}); 

return resolverObservable; 

SubnavResolverService

コード例:

setLoggedInUser(_loggedInUser: UserModel) : Observable<UserModel> { 
    this._loggedInUser.next(_loggedInUser); 
    return this._loggedInUser.asObservable(); 
} 

問題の担当者ですか?

セッションストアが観測可能なデータサービスを使用し、AppResolverがその観測可能なデータをプッシュしているため、非同期関数であるため、SubnavResolverServiceがデータを要求する確率は50%ですAppResolverは終了していますが、SessionStoreはまだデータプッシュを実行しているため、未定義のユーザーです。

私はここで何を達成しようとしていますか?

たとえば、AppResolverを何らかの形で遅延させることができますか?ユーザデータを受信して​​からsessionStoreに設定しようとしてから200ms?その結果、解決すると、ユーザーデータが店舗に安全に保存されていることが確認できます。

答えて

0

Welp、私はちょうど1つの解決策を考え出しました。

Observableが返されたAppResolverServiceには、RXjs delay()修飾子が追加されているため、リゾルバは遅延しますが、セッションストアには更新が処理される時間があります。

return resolverObservable.delay((new Date(Date.now() + 200))); 

これは、リゾルバ200msを遅延させます。

私は他のソリューションにもオープンしていますので、詳しい人を教えてください!

関連する問題