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