在订阅方法之外获取变量数据
getting variable data outside subscribe method
我正在尝试为用户路由实现 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;
}
}
在这里,当我控制它时,我可以在订阅方法中获取数据变量,但在该方法之外给出 undefined
值。我如何在方法之外访问它。
BaseService.valid
returns 一个在 canActivate
方法 returns 之后发出的 Observable。
订阅块后的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;
}
那是不可能的。原因是,您正在尝试呈现一个值,其值会被 Observable 不断改变。
现在,当您尝试读取 outside
console.log 时,您会得到未定义的值,因为该值尚未由 Observable [=11] 设置=].当值更改时(假设在 1 秒后),outer
console.log 已经执行,因此您不会看到 this.data
的任何更改
为了监视其值的变化,将函数调用放在 subscribe
块本身中。
更新 1
根据您的评论,您
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
为了能够将数据推送到您定义的数组,首先您必须将其初始化为一个空数组,因此:
而不是:
data:Array<Object>
试试这个:
data: Array<any> = new Array<any>();
这是我用的,希望对你有帮助。
我正在尝试为用户路由实现 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;
}
}
在这里,当我控制它时,我可以在订阅方法中获取数据变量,但在该方法之外给出 undefined
值。我如何在方法之外访问它。
BaseService.valid
returns 一个在 canActivate
方法 returns 之后发出的 Observable。
订阅块后的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;
}
那是不可能的。原因是,您正在尝试呈现一个值,其值会被 Observable 不断改变。
现在,当您尝试读取 outside
console.log 时,您会得到未定义的值,因为该值尚未由 Observable [=11] 设置=].当值更改时(假设在 1 秒后),outer
console.log 已经执行,因此您不会看到 this.data
为了监视其值的变化,将函数调用放在 subscribe
块本身中。
更新 1
根据您的评论,您
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
为了能够将数据推送到您定义的数组,首先您必须将其初始化为一个空数组,因此:
而不是:
data:Array<Object>
试试这个:
data: Array<any> = new Array<any>();
这是我用的,希望对你有帮助。