Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript subscribe()函数是否同步执行?_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

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

Javascript subscribe()函数是否同步执行?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我只是想再核实一下 其中有一个AuthenciatedGuard,具有以下块: Auth.isSignedIn().subscribe(yes=>{ if (yes) { this.router.navigate(['/home']); return false; } }); return true; 因此,我只想确保subscribe语句在到达return true行之前保证完全执行并返回false。您只需返回一个可观察的: 您还可以使用Promise返

我只是想再核实一下

其中有一个AuthenciatedGuard,具有以下块:

Auth.isSignedIn().subscribe(yes=>{
  if (yes) {
      this.router.navigate(['/home']);
      return false;
  }
});
return true;
因此,我只想确保subscribe语句在到达return true行之前保证完全执行并返回false。

您只需返回一个可观察的:

您还可以使用Promise返回类型,使您的函数异步,并使用Wait将可观测值转换为Promise:

异步函数只能返回一个承诺


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

您可以很容易地返回一个可观察或承诺,因为根据接口,这是由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;
      }));
   }
}

您可以将activator简化为以下内容:

返回Auth.isSignedIn.pipe tapyes=>yes&&this.router.navigate['/home'], 地图街 ;
当您不能直接看到一个可观察对象的创建时,您应该始终假定它是异步的。如果Auth.isSignedIn是由第三方库发布的,您会怎么做?

这将取决于isSignedIn返回的可观察内容,您不应该依赖它。为什么这是个问题?您能描述一下为什么需要同步吗?在这种情况下,我们需要在执行返回的true之前到达返回的false语句,我们需要保证这是事实,否则角度路由器将不会执行我们希望它执行的操作。不,它绝对不会。实际上,从.subscribe回调返回没有意义。如果要返回布尔值的可观测值,则需要管道不订阅。这仅仅是因为在你错误地告诉路由器用户可以看到页面后,你离开了页面。非常感谢!我真的很喜欢它有多干净。唯一的问题是,当我们将async放在canActivate前面时,Typescript会抱怨。它希望返回与当前签名不一致的全局承诺。canActivate官方签名接受不同的返回类型:是的,我看到了。也许承诺回报部分不是全局的?下面是一个stackblitz,它显示了错误:对不起,异步解决方案不适用于Angular Guard。我正在改变我的答案。我真的很喜欢这个承诺的解释。我认为这对一般人来说是有用的。也许你可以在答案的页脚加上一个注释。请注意,由于签名的原因,它不能与canActivate一起使用,但它是一种使订阅同步的新方法。非常感谢!我想我应该更仔细地看一下退货签名:哦,我第一次看到这样的东西时,我就有了!是的,还有一个问题。是的,因为如果用户已经登录,我们想拒绝登录。相关文章:@Ole我明白。我更新了代码,以便更清楚地了解正在发生的事情。
async canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Promise<boolean> {
    const yes = await Auth.isSignedIn().toPromise();
    if (yes) {
      this.router.navigate(['/home']);
      return false;
    }
    return true;
}
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;
      }));
   }
}