私は、興味深いジレンマを持っています。私は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?その結果、解決すると、ユーザーデータが店舗に安全に保存されていることが確認できます。