簡體   English   中英

訂閱()函數是否同步執行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM