Получение переменных данных вне метода подписки

Я пытаюсь реализовать 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 значение. Как я могу получить доступ к нему вне метода.

2 ответа

Решение

Это не будет возможно. Причина в том, что вы пытаетесь отобразить значение, значение которого постоянно изменяется с помощью Observable.

Теперь, когда вы пытаетесь читать outside console.log, вы получаете неопределенное значение, так как значение еще не установлено Observable streams, Теперь, когда значение изменяется (скажем, через 1 секунду), outer console.log уже был выполнен, и поэтому вы не увидите никаких изменений this.data

Чтобы отслеживать изменение его значения, поместите вызов функции в subscribe заблокировать себя.

Обновление 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;
}

Чтобы иметь возможность передавать данные в массив, который вы определили, сначала вам нужно инициализировать его как пустой массив, поэтому:

Вместо того:

data:Array<Object>

попробуй это:

data: Array<any> = new Array<any>();

Это то, что я использую, надеюсь, это поможет.

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
Другие вопросы по тегам