Angular 2 APP_INITIALIZER执行顺序/异步问题
我有2个APP_INITIALIZER提供程序……第一个发出HTTP请求来获取环境信息.
第二个使用环境信息来授权用户针对OIDC Authority服务器端点(从环境调用获得). 看起来,尽管使环境服务成为授权服务的依赖,但在环境调用完成之前调用授权服务的APP_INITIALIZER工厂函数. { provide: APP_INITIALIZER,multi: true,useFactory: EnvironmentFactory,deps: [] } { provide: APP_INITIALIZER,useFactory: AuthorizationFactory,deps: [EnvironmentProvider] } 提供给APP_INITIALIZER的两个工厂都是签名: Factory() { return () => Promise; } 结果是授权调用提交到undefined而不是正确的URL. 我想过把工厂结合起来 – 但它们分为两个不同的模块,所以感觉很麻烦.指导赞赏! 解决方法
我最终将已解析的EnvironmentProvider注入AuthorizationFactory.
我向EnvironmentProvider添加了一个observable,它可以随时更改Authority值. { provide: APP_INITIALIZER,deps: [EnvironmentProvider] } { provide: APP_INITIALIZER,deps: [AuthorizationProvider,EnvironmentProvider] } export function AuthorizationFactory (auth: AuthorizationProvider,env: EnvironmentService) { return new Promise((resolve,reject) => env.Authority$() // don't emit until authority provider has a value .skipWhile(authority => !authority) // dispatch the auth command to ngrx/store. .do(() => store.dispatch({ type: 'AuthorizeIdentity' })) // switch to observe identity state .switchMap(() => store.select('Identity')) // don't emit until there is an identity (async authorization complete). .skipWhile(identity => !identity) // finish. .take(1) .subscribe(resolve,reject) }); } 我使用ReplaySubject(1)作为env.Authority $()的源代码.这确保了返回的observable总是在AuthorizationFactory订阅时发出(例如,如果在AuthorizationFactory订阅之前解析了Authority). 任何遇到此问题的人都在想我为什么不使用toPromise()……我认为存在一些问题(我已在此处提交审核). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- XFire令WebService如此简单
- 一篇博客分清shell中的状态返回值-return-break-continue-e
- Webservice_24_SOAP的基于契约优先开发用户管理_部署到Tomc
- 单元测试 – AngularJS – 使用$http服务的测试服务方法
- 在特定数量的子列表中划分列表
- 使用CXF发布和调用webservice之HelloWorld入门
- 利用resteasy框架构建rest webservice----第三波:实现文件
- Calling WebServices using j
- Angular测试失败,无法在’XMLHttpRequest’上执行’send’
- angularjs – Angular – 我可以从角度应用程序外部广播消息