角度路由器:navigateByUrl()用false解析

时间:2017-05-25 15:19:29

标签: angular angular-routing

根据Angular的navigateByUrl文档,它会返回一个将使用truefalse解析的承诺,具体取决于导航是成功还是失败。如果发生错误,则承诺将被拒绝,并显示错误。

我尝试在navigateByUrl服务中使用AuthGuard,以便在成功进行身份验证后将用户导航到其原始网址。但是,导航失败,并且使用false解决了承诺。它没有被拒绝。没有关于它失败原因的进一步信息。

我已经确认,当通过true电话触发后,警卫会返回navigateToUrl()

以下是AuthGuard的完整代码:

import { Location } from '@angular/common';
import { Injectable } from '@angular/core';
import { CanLoad, Router } from '@angular/router';

import { AuthService } from './auth.service';

@Injectable()
export class AuthGuard implements CanLoad {
  public constructor(
    private authService: AuthService,
    private router: Router,
    private location: Location,
  ) { }
  public canLoad() {
    return this.authService.validateToken()
      .map(isAuthenticated => ({
        isAuthenticated,
        willRedirect: this.manageRedirect(isAuthenticated),
      }))
      .do(result => {
        if (!result.isAuthenticated) {
          // will navigate away from Angular application to OAuth page
          this.authService.startLogin();
        }
      })
      .map(result =>
        result.isAuthenticated && !result.willRedirect);
  }

  private manageRedirect(isAuthenticated: boolean) {
    let willRedirect = false;

    if (isAuthenticated) {
      const redirectUri = sessionStorage.getItem('redirectUri');
      sessionStorage.removeItem('redirectUri');

      if (redirectUri) {
        willRedirect = true;
        this.router.navigateByUrl(redirectUri).then(success => {
          console.log(success);  // false!!
        });
      }
    } else {
      const redirectUri = this.location
        .prepareExternalUrl(this.location.path());

      sessionStorage.setItem('redirectUri', redirectUri);
    }

    return willRedirect;
  }
}

请注意,如果我延迟navigateByUrl通话超时约1秒,导航将有效。

1 个答案:

答案 0 :(得分:0)

你的逻辑非常令人困惑,你在同一时间对许多事情做了很多事情。 你说:

  

如果我以大约1秒的超时延迟navigateByUrl调用,导航将起作用。

Javascript是单线程,因此在完成整个canLoad方法之前,它不会执行导航。因此,如果您的逻辑依赖于导航的结果继续canLoad方法,则需要重写逻辑以在导航结果函数.then(success => { here...内运行。