2017-04-15 56 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。

我也对其他解决方案开放,请详细说明家伙!