我正在尝试为用户路由实现canActivate,之前我想检查访问令牌是否仍然有效。因此我实现了类似的东西
export class AuthGuard implements CanActivate {
data:Array<Object>;
constructor(private base: BaseService){}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
var session: any = { token: localStorage.getItem('abc') };
this.base.valid(session).subscribe(result => {
this.data=result;
console.log(this.data); <-- first
});
console.log(this.data); <-- second
return true;
}
}
这里我可以在我控制它时在subscribe方法中获取数据变量,但在此方法之外的是undefined
值。如何在方法之外访问它。
答案 0 :(得分:3)
这不可能。原因是,您正在尝试渲染其值由Observable连续更改的值。
现在,当您尝试阅读outside
console.log 时,由于Observable streams
尚未设置该值,因此未定义。现在,当值改变时(假设在1秒后),outer
console.log已经执行,因此您不会看到this.data
要监视其值的变化,请将函数调用放入subscribe
块本身。
根据您的评论,您can refer this link
答案 1 :(得分:1)
BaseService.valid
返回一个Observable,它在canActivate
方法返回后发出。
当console.log
仍然未定义时,首先执行订阅块之后的this.data
。
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
// 1.
var session: any = { token: localStorage.getItem('abc') };
this.base.valid(session).subscribe(result => {
// 3.
this.data=result;
console.log(this.data);
});
// 2.
console.log(this.data);
return true;
}
答案 2 :(得分:0)
public new_data:any=[];
this.base.valid(session).subscribe(result => {
this.data=result;
for(let data of this.data) {
this.new_data.push(id:data.id, name:data.name)
}
console.log(this.new_data); <-- first
});
console.log(this.new_data); <-- Second
答案 3 :(得分:0)
要能够将数据推送到您定义的数组,首先必须将其初始化为空数组,这样:
代替:
data:Array<Object>
尝试一下:
data: Array<any> = new Array<any>();
这就是我用的,希望对您有所帮助。