Как вернуться из цикла, когда условие выполнено в angular?

#angular #foreach #rxjs #observable

#угловой #инструкция foreach #rxjs #наблюдаемый

Вопрос:

Я вызывал эту функцию из своего routing.module.ts. Эта функция проверяет, есть ли у пользователя утверждение, возвращает значение true, иначе перенаправит его на страницу ошибки.

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

Ибо здесь это называется

 canActivate(route: ActivatedRouteSnapshot): Observablelt;booleangt; {   const claim: string = route.data[RouteData.Claim];   return this.securityService.hasClaim(claim).pipe(  map((hasClaim) =gt; {  if (hasClaim) {  return true;  } else {  this.router.navigate(['/forbidden']);  return false;  }  })  );  }  

Мне нужно изменить эту функцию, чтобы проверить наличие нескольких утверждений. Если у пользователя есть какое-либо из этих утверждений, оно должно вернуть значение true, иначе вернет страницу с ошибкой. Я подумываю об использовании claims.map() для перебора каждого утверждения. Но, как вернуться изнутри, если будет найдено какое-либо утверждение, иначе верните страницу с ошибкой?

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

Это Вызывает:

 canActivate(route: ActivatedRouteSnapshot): Observablelt;booleangt; {   const claims: string[] = route.data[RouteData.Claim];   claims.foreach(claim -gt; {  this.securityService.hasClaim(claim).pipe(  map((hasClaim) =gt; {  if (hasClaim) {  return true;  }  })  )});  this.router.navigate(['/forbidden']);  return false;  }  

Комментарии:

1. я использую метод SecurityService.HasClaim (), чтобы проверить, есть ли у меня претензия. Я делаю внутри него другие вещи, поэтому не могу его удалить. Он возвращает наблюдаемое. Теперь я должен запустить вызов этого метода внутри цикла, но, поскольку он заметен, это сильно усложняет задачу.

Ответ №1:

Попробуйте это:

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

Использование карты в массиве утверждений приведет к созданию an Arraylt;Observablelt;booleangt;gt; , поэтому я использую forkJoin ее для преобразования в an Observablelt;Arraylt;booleangt;gt; . Затем мы можем передать полученное наблюдаемое по каналу, как мы привыкли, и проверить, что каждое значение истинно.