在Angular 4应用程序中,当服务完成其工作时尝试重定向
我有一个AuthService,我正在从LoginComponent调用一个SigningAction方法。我想在令牌初始化时重定向 我怎样才能做到这一点 下面是我的auth.service.ts文件中的一个SignIn方法在Angular 4应用程序中,当服务完成其工作时尝试重定向,angular,angular-ui-router,angular-services,Angular,Angular Ui Router,Angular Services,我有一个AuthService,我正在从LoginComponent调用一个SigningAction方法。我想在令牌初始化时重定向 我怎样才能做到这一点 下面是我的auth.service.ts文件中的一个SignIn方法 signInAction(){ let that = this; new Oidc.UserManager(this.config).signinRedirectCallback().then(function (user) {
signInAction(){
let that = this;
new Oidc.UserManager(this.config).signinRedirectCallback().then(function (user) {
that.currentUser = user;
that.token = user.access_token;
}).catch(function (e) {
console.error(e);
});
}
这是我的LoginComponent文件
ngOnInit() {
this.authService.signInAction();
//Wait until signInAction is complete before navigateByUrl
this.router.navigateByUrl('/my-profile');
}
/更新的工作版本/
感谢大家,我学会了如何观察工作,这是我最后的工作版本
//在AuthService中
signInAction(){
let that = this;
return Observable.create(observer =>
new Oidc.UserManager(this.config).signinRedirectCallback().then(function (user) {
that.currentUser = user;
that.token = user.access_token;
observer.next();
observer.complete();
}).catch(function (e) {
console.error(e);
observer.complete();
})
);
}
//在我的登录组件中
ngOnInit() {
this.authService.signInAction()
.subscribe(
() => this.router.navigateByUrl('/my-profile')
);
}
也许有更好的办法。但是,您现在可以使用EventEmitter并在组件上订阅它来解决此问题:
从'@angular/core'导入{EventEmitter}代码>
在服务类中定义事件发射器并在令牌更新后发出事件:
tokenUpdated = new EventEmitter<void>();
signInAction() {
let that = this;
new Oidc.UserManager(this.config).signinRedirectCallback().then(function (user) {
that.currentUser = user;
that.token = user.access_token;
that.tokenUpdated.emit();
}).catch(function (e) {
console.error(e);
});
}
我同意所有的答案,这些答案会告诉你使用可观察的,但是为了得到你必须工作的东西,你可以使用一个简单的回调函数,比如
this.authService.signInAction((user) => {
this.router.navigateByUrl('/my-profile');
});
// ---
signInAction(next){
let that = this;
new Oidc.UserManager(this.config)
.signinRedirectCallback()
.then(function (user) {
that.currentUser = user;
that.token = user.access_token;
next(user);
正如目前所写,您不能。这一过程何时结束,从外部无法判断。您可以返回可以从签名操作中观察到的内容,然后执行this.authService.signInAction().subscribe(()=>this.router.navigateByUrl('/my profile'))
。或者通过可观察到的事件公开流程完成,例如,this.authService.signInAction();this.authService.signedIn$.subscribe(…)代码>这个解决方案也非常有效,但我非常喜欢eventImitter。谢谢你的解决方案
this.authService.signInAction((user) => {
this.router.navigateByUrl('/my-profile');
});
// ---
signInAction(next){
let that = this;
new Oidc.UserManager(this.config)
.signinRedirectCallback()
.then(function (user) {
that.currentUser = user;
that.token = user.access_token;
next(user);