在subscribe方法之外获取可变数据

时间:2018-04-10 09:30:53

标签: angular angular4-httpclient angular-guards

我正在尝试为用户路由实现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值。如何在方法之外访问它。

4 个答案:

答案 0 :(得分:3)

这不可能。原因是,您正在尝试渲染其值由Observable连续更改的值。

现在,当您尝试阅读outside console.log 时,由于Observable streams尚未设置该值,因此未定义。现在,当值改变时(假设在1秒后),outer console.log已经执行,因此您不会看到this.data

的任何更改

要监视其值的变化,请将函数调用放入subscribe块本身。

更新1

根据您的评论,您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>();

这就是我用的,希望对您有所帮助。