我正在使用Azure AD登录到我的角度应用程序。使用MSAL,我可以使用MsalService的loginPopup()
方法执行此操作。另外,我正在使用ngrx来管理我的状态。相关的代码摘录看起来像这样
/登录页面调用中的登录按钮
login(): void {
this._store.dispatch(new Login());
}
哪个触发了此操作
export class Login implements Action {
readonly type = AuthActionTypes.LOGIN;
}
自身会被一种效果所捕获,即成功接收到id_token会检查其签名的有效性(然后,该签名成功后将分派LoginSuccess操作)。否则,通过调度LoginFail操作将登录视为失败。
@Effect()
doLogin$: Observable<Action> = this._actions$.pipe(
ofType<Login>(AuthActionTypes.LOGIN),
switchMap(() => {
return observableFrom(this._msal.loginPopup()).pipe(
map(idToken => new CheckTokenValidity(idToken)),
catchError(error => of(new LoginFail(error)))
);
})
);
这很好,但是我现在想用MsalService.loginPopup(): Promise<any>
代替MsalService.loginRedirect(): void
。但有一个问题,我希望我的ngrx效果链会中断,因为那样就不再有任何承诺,而只会返回空值。
我将如何处理修复这个?
欢呼声
这是一个较旧的问题,但我会给它一个答案,因为在搜索NGRX和Msal / Adal时仍会弹出。
更新您的效果以不发送任何动作,它会破坏链条。
@Effect({dispatch: false)
doLogin$: Observable<Action> = this._actions$.pipe(
ofType<Login>(AuthActionTypes.LOGIN),
tap(() => {
// void function
})
);