根据Angular的navigateByUrl
文档,它会返回一个将使用true
或false
解析的承诺,具体取决于导航是成功还是失败。如果发生错误,则承诺将被拒绝,并显示错误。
我尝试在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秒,导航将有效。
答案 0 :(得分:0)
你的逻辑非常令人困惑,你在同一时间对许多事情做了很多事情。 你说:
如果我以大约1秒的超时延迟navigateByUrl调用,导航将起作用。
Javascript是单线程,因此在完成整个canLoad
方法之前,它不会执行导航。因此,如果您的逻辑依赖于导航的结果继续canLoad
方法,则需要重写逻辑以在导航结果函数.then(success => { here...
内运行。