在Angular 4应用程序中,当服务完成其工作时尝试重定向

在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) {

我有一个AuthService,我正在从LoginComponent调用一个SigningAction方法。我想在令牌初始化时重定向

我怎样才能做到这一点

下面是我的auth.service.ts文件中的一个SignIn方法

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);