[英]Does the subscribe() function execute synchronously?
只是想仔細檢查。 我有這個演示 。
其中包含一個帶有以下塊的AuthenciatedGuard
:
Auth.isSignedIn().subscribe(yes=>{
if (yes) {
this.router.navigate(['/home']);
return false;
}
});
return true;
因此,我只想確保在到達行return true
之前,可以保證完全執行subscribe()
語句並返回false
。
您可以只返回一個Observable<boolean>
:
return Auth.isSignedIn().pipe(map(yes=>{
if (yes) {
this.router.navigate(['/home']);
return false;
} else {
return true;
}
}));
您還可以使用Promise
返回類型,以使函數async
並使用await將Observable
轉換為Promise
:
async canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Promise<boolean> {
const yes = await Auth.isSignedIn().toPromise();
if (yes) {
this.router.navigate(['/home']);
return false;
}
return true;
}
async
函數只能返回Promise
。
您不應該依賴它是同步的,因為它可能是現在,但不是明天。
根據接口,您可以輕松返回Observable<boolean>
或Promise<boolean>
,因為Angular支持。
export class AuthenticatedGuard implements CanActivate {
constructor( private router: Router ) { }
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return Auth.isSignedIn().pipe(map(isAlreadyLoggedIn => {
if (isAlreadyLoggedIn) {
this.router.navigate(['/home']);
return false;
}
return true;
}));
}
}
您可以將激活器簡化為以下形式:
return Auth.isSignedIn().pipe(
tap(yes => yes && this.router.navigate(['/home'])),
mapTo(true)
);
當您不能直接看到它的創建時,您應該始終假定它是異步的。 如果Auth.isSignedIn()
由第三方庫發布,該怎么辦?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.