2017-04-15 59 views
0

我回來了,有趣的困境。我正在構建一個angular2應用程序,並使用RXjs可觀察數據存儲爲我的應用程序提供數據。即在啓動時,如果用戶已登錄,則應用程序解析器以角度方式獲取登錄的用戶數據,然後將其推送到商店,然後將這些數據提供給只有登錄用戶才能看到的應用程序部分。這意味着,例如,用戶通過身份驗證的JWT令牌也位於商店中。帶有RXjs的Angular2嵌套解析器存儲競爭條件

路由示例

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

觀察旋轉變壓器是如何嵌套,其中,所述

AppResolverService

如果用戶已登錄然後取出JWT令牌和其它用戶數據,並將其發送到會話存儲數據服務。否則,用戶將被重定向到登錄。

代碼例如:

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

return resolverObservable; 

SubnavResolverService

獲取從會話存儲數據服務

代碼示例用戶證書:

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

SessionStore

代碼示例:

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

問題官?

問題是,您可以看到會話存儲使用可觀察數據服務,並且自從AppResolver推送可觀察數據並且它是異步函數,那麼SubnavResolverService開始請求數據的概率爲50%一個未定義的用戶,因爲AppResolver已經完成,但SessionStore仍在運行數據推送。

我想在這裏實現什麼?

AppResolver可以以某種方式延遲例如。它已收到用戶數據並嘗試將其設置在sessionStore 200毫秒後?因此,當它解決時,我可以確定用戶數據安全地存儲在商店中。

回答

0

韋爾普,我只想出了1個解決方案。

在返回Observable的AppResolverService中,我添加了一個RXjs delay()修飾符,以便解析器被延遲,但會話存儲有時間處理它的更新。

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

這延遲了解析器200ms。

我也對其他解決方案開放,請詳細說明傢伙!