私はAngularでIonicを使用しています。ルート ガードの 1 つの内部で、firestore ドキュメントが作成されているかどうかを確認する必要があり、そのブール値が返されます。サーバーからの応答を取得するのに時間がかかりますが、ルート ガードは値が返されるのを待ちません。戻り、正常に実行されるため、ページは保護されていません! ルート ガードに値を待機させるにはどうすればよいですか? または、ルート ガードが実行される前に値を返しますか? これは、リクエストをfirestoreに送信する場所です:
export class FirebaseService {
ex: Promise<boolean>;
categoryDone: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
constructor(private afs: AngularFirestore) {
this.ex = new Promise((resolve) => {
this.afs.collection('users').doc(this.user.uid).collection('categories').get().toPromise().then(
data => {
if (data.size > 0) {
resolve(true)
} else {
resolve(false)
}
}
)
})
this.ex.then(data=>{
if (data) {
this.categoryDone.next(true)
} else {
this.categoryDone.next(false)
}
})
}
そして、これは私のページに使用するルートガードコードです:
export class CategoryDoneGuard implements CanActivate {
categoryDone: boolean;
constructor(private router: Router, private firebaseService: FirebaseService) {
this.firebaseService.categoryDone.asObservable().subscribe(
categoryDone => this.categoryDone = categoryDone
)
}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | boolean {
console.log(this.categoryDone,"Category Done VAriable in CategoryDoneGuard")
setTimeout(() => {
console.log(this.categoryDone,"Catgeory") //true because i waited 1 second
}, 1000);
if (!this.categoryDone) { //variable is undefined here
console.log('You are in InfoDoneGuard')
return true
}
this.router.navigate(['tabs/tab-profile'])
return false
}
}