getting variable data outside subscribe method

本小妞迷上赌 提交于 2020-01-15 07:09:07

问题


I am trying to implement canActivate for user routes, before that I want to check whether the access token is still valid or not. Therefore I implement something like this

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;
  }
}

here I can get the data variable inside the subscribe method when I console it but outside this method is give undefined value. How can I access it outside the method.


回答1:


This wont be possible. Reason being, you are trying to render a value whose value is continuously changed by Observable.

Now, when you are trying to read outside console.log, you get undefined as the value is yet to be set by Observable streams. Now, when the value is changed ( lets say after 1 sec ), the outer console.log has already been executed and so you wont see any changes of the this.data

To make monitor the change in it's value, put the function call in the subscribe block itself.

Update 1

As per your comment, You can refer this link




回答2:


The BaseService.valid returns an Observable which emits after the canActivate method returns.

The console.log after the subscribe block executes first, when this.data is still undefined.

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;
}



回答3:


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


来源:https://stackoverflow.com/questions/49750121/getting-variable-data-outside-subscribe-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!