subscribe() 函数是否同步执行?

只是想仔细检查一下。 我有这个演示。


其中有一个AuthenciatedGuard带有以下块:


Auth.isSignedIn().subscribe(yes=>{

  if (yes) {

      this.router.navigate(['/home']);

      return false;

  }

});

return true;

所以我只想确保该subscribe()语句保证完全执行并false在我们到达该行之前返回return true。


繁星淼淼
浏览 528回答 3
3回答

holdtom

你不应该依赖它是同步的,因为它可能是现在,但不是明天。根据接口,您可以轻松返回 anObservable<boolean>或 a Promise<boolean>,因为 Angular 支持。export class AuthenticatedGuard implements CanActivate {&nbsp; constructor( private router: Router ) { }&nbsp; canActivate(&nbsp; &nbsp; next: ActivatedRouteSnapshot,&nbsp; &nbsp; state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {&nbsp; &nbsp; &nbsp; return Auth.isSignedIn().pipe(map(isAlreadyLoggedIn => {&nbsp; &nbsp; &nbsp; &nbsp; if (isAlreadyLoggedIn) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.router.navigate(['/home']);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; }));&nbsp; &nbsp;}}

杨__羊羊

你可以只返回一个Observable<boolean>:return Auth.isSignedIn().pipe(map(yes=>{&nbsp; if (yes) {&nbsp; &nbsp; &nbsp; this.router.navigate(['/home']);&nbsp; &nbsp; &nbsp; return false;&nbsp; } else {&nbsp; &nbsp; &nbsp;return true;&nbsp; }}));您还可以使用Promise返回类型,为此创建您的函数async并使用 await 将Observablea转换为Promise:async canActivate(&nbsp; &nbsp; next: ActivatedRouteSnapshot,&nbsp; &nbsp; state: RouterStateSnapshot): Promise<boolean> {&nbsp; &nbsp; const yes = await Auth.isSignedIn().toPromise();&nbsp; &nbsp; if (yes) {&nbsp; &nbsp; &nbsp; this.router.navigate(['/home']);&nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; return true;}一个async函数只能返回一个Promise.

慕妹3242003

您可以将激活器简化为如下所示:return Auth.isSignedIn().pipe(&nbsp; &nbsp; tap(yes => yes && this.router.navigate(['/home'])),&nbsp; &nbsp; mapTo(true));当您无法直接看到它的创建时,您应该始终假设observable 是异步的。如果Auth.isSignedIn()是由第三方图书馆发布的,你会怎么做?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript