首页 > 解决方案 > Angular auth 保护嵌套异步调用

问题描述

我在尝试调用两个异步 http 请求时遇到了一个问题,我试图调用两个异步 http 请求,然后在成功完成后我想做第三个以获取最后一个信息,然后再让用户访问该页面。

到目前为止,这是我的代码:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

    if (this.recruteurService.getUserInfo() &&
      this.recruteurService.getIndividuPro() &&
      this.recruteurService.getEtablissement()) {
      return true;
    }

    return forkJoin(
      this.recruteurService.rechercherUserInfo(),
      this.recruteurService.rechercherIndividuProfessionnel())
      .mergeMap(([userInfo, individuPro]) => {
        if (userInfo && individuPro) {
          this.recruteurService.setUserInfo(userInfo);
          this.recruteurService.setIndividuPro(individuPro);
        } else {
          return false;
        }

        return this.recruteurService.rechercherEtablissementParIdRce(individuPro.etablissements[0]).map(
          (etablissement: Etablissement) => {
            if (etablissement) {
              this.recruteurService.setEtablissement(etablissement);
              return of(true);
            }
            return of(false);
          });
      });
  }

问题是我遇到了一个错误:

src/app/guard/initialization.guard.ts(32,17) 中的错误:错误 TS2345:类型参数 '([userInfo, individuPro]: [any, Individu]) => false | Observable>' 不可分配给类型为 '(value: [any, Individu], index: number) => ObservableInput>' 的参数。输入'假| Observable>' 不可分配给类型 'ObservableInput>'。类型“false”不可分配给类型“ObservableInput>”。

但我不知道有什么问题。

标签: angularrxjsobservablefork-join

解决方案


您已定义canActivate() => boolean,但如果我正确理解您的代码,forkJoin()您将返回。Observable<boolean>

canActivate方法可以返回booleanObservable<boolean>因此boolean | Observable<boolean>返回类型,请参阅https://angular.io/api/router/CanActivate

您可能只想制作canActivate(...): boolean | Observable<boolean>或仅使用canActivate(...): Observable<boolean>然后返回return of(true);


推荐阅读