为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2021-10-14 15:44:20
只是想仔细检查一下。 我有这个演示。其中有一个AuthenciatedGuard带有以下块:Auth.isSignedIn().subscribe(yes=>{  if (yes) {      this.router.navigate(['/home']);      return false;  }});return true;所以我只想确保该subscribe()语句保证完全执行并false在我们到达该行之前返回return true。
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

你不应该依赖它是同步的,因为它可能是现在,但不是明天。


根据接口,您可以轻松返回 anObservable<boolean>或 a 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;

      }));

   }

}


查看完整回答
反对 回复 2021-10-14
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

你可以只返回一个Observable<boolean>:


return Auth.isSignedIn().pipe(map(yes=>{

  if (yes) {

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

      return false;

  } else {

     return true;

  }

}));

您还可以使用Promise返回类型,为此创建您的函数async并使用 await 将Observablea转换为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.


查看完整回答
反对 回复 2021-10-14
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您可以将激活器简化为如下所示:


return Auth.isSignedIn().pipe(

    tap(yes => yes && this.router.navigate(['/home'])),

    mapTo(true)

);

当您无法直接看到它的创建时,您应该始终假设observable 是异步的。如果Auth.isSignedIn()是由第三方图书馆发布的,你会怎么做?


查看完整回答
反对 回复 2021-10-14
  • 3 回答
  • 0 关注
  • 527 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信