Попробуйте это:
public userHasRoles(roles: string[]): Observable<boolean> {
return from(roles).pipe(
mergeMap((role) => this.auth.currentUserHasRole(role)),
reduce((hasPrevRoles, hasRole) => hasPrevRoles && hasRole),
);
}
Используя следующие операции импорта:
import { from } from 'rxjs';
import { mergeMap, reduce } from 'rxjs/operators';
Функция from
сначала создает наблюдаемое, которое испускает роли в последовательности. Затем mergeMap
создает сглаженный поток логических результатов от вызова currentUserHasRole
для каждой испущенной роли. Наконец, reduce
объединяет все логические значения в один логический тип, который имеет значение true, только если все входные логические значения были истинными, аналогично тому, как работает Array.reduce.
reduce
здесь аналогично forkJoin: он возвращает наблюдаемую единицу, которая излучает один раз с объединенным значением, как только завершается входная наблюдаемая. Возвращенная наблюдаемая затем сама завершится.