加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular 2 APP_INITIALIZER执行顺序/异步问题

发布时间:2020-12-17 17:00:36 所属栏目:安全 来源:网络整理
导读:我有2个APP_INITIALIZER提供程序……第一个发出HTTP请求来获取环境信息. 第二个使用环境信息来授权用户针对OIDC Authority服务器端点(从环境调用获得). 看起来,尽管使环境服务成为授权服务的依赖,但在环境调用完成之前调用授权服务的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()……我认为存在一些问题(我已在此处提交审核).
https://github.com/Reactive-Extensions/RxJS/issues/1429

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读