【问题标题】:How to return from loop when condition satisfied in angular?当角度满足条件时如何从循环返回?
【发布时间】:2021-12-02 17:34:27
【问题描述】:

我是从我的 routing.module.ts 调用这个函数的。此函数检查用户是否有声明,返回 true 否则将他重定向到错误页面。

const routes: Routes = [
{
    path: NavigationURL_EmployeeAuditChildren.PayItems, component: PayItemsComponent, canActivate: [EmployeeGuard], data: { claim: claims.employeePayItemAccess} }
}

这里叫做

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {

        const claim: string = route.data[RouteData.Claim];

        return this.securityService.hasClaim(claim).pipe(
            map((hasClaim) => {
                if (hasClaim) {
                    return true;
                } else {
                    this.router.navigate(['/forbidden']);
                    return false;
                }
            })
        );
    }

我需要修改此函数,以检查多个声明。如果用户有任何这些声明,它应该返回 true,否则返回错误页面。我正在考虑使用 claim.map() 来遍历每个声明。但是,如果找到任何声明,如何从其中返回,否则返回错误页面?

const routes: Routes = [
{
    path: NavigationURL_EmployeeAuditChildren.PayItems, component: PayItemsComponent, canActivate: [EmployeeGuard], data: { darwinClaim: [claims.employeePayItemAccess, claims.employeePayItemAuditAccess] } 
}

它调用:

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {

        const claims: string[] = route.data[RouteData.Claim];

        claims.foreach(claim -> {
            this.securityService.hasClaim(claim).pipe(
                map((hasClaim) => {
                    if (hasClaim) {
                         return true;
                    }
                })
        )});
         this.router.navigate(['/forbidden']);
         return false;
    }

【问题讨论】:

  • 我正在使用 securityService.hasClaim() 方法来检查我已声明。我正在里面做其他事情,所以无法删除它。它返回一个可观察的。现在我必须在循环中运行调用此方法,但由于它是可观察到的,这让事情变得非常困难。

标签: angular foreach rxjs observable


【解决方案1】:

试试这个:

const hasClaimsResult = forkJoin(claims.map(claim => this.securityService.hasClaim(claim)));

return hasClaimsResult.pipe(
    map(claims => {
        if (claims.every(claim => claim)) {
            return true;
        } else {
            this.router.navigate(['/forbidden']);
            return false;
        }
    })
);

在声明数组上使用 map 会产生一个Array&lt;Observable&lt;boolean&gt;&gt;,所以我使用forkJoin 将其转换为一个Observable&lt;Array&lt;boolean&gt;&gt;。然后我们可以按照我们的习惯使用管道输出结果 observable 并检查每个值是否为真。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2023-01-12
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2017-08-12
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多