我们有一个canActivate防护,应该返回Observable(boolean)。
布尔状态是通过服务获得的,我们需要以1秒的间隔轮询3次,直到收到响应“ true”。
问题是,每当takeWhile返回false时,我们都会收到以下消息
error:
failure.service.ts:36 Error: Uncaught (in promise): EmptyError: no elements in sequence
EmptyError: no elements in sequence
下面的是引起问题的代码。 RXJS版本是^ 6.2.1 Angular CLI版本是^ 6.0.8
import { repeat, delay, takeWhile, map } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthService } from '../services/auth.service';
import { Observable, of } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService) { }
canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): Observable<boolean> {
return this.authService.isAuthenticated().pipe(
delay(1000),
repeat(3),
takeWhile((authenticated: boolean) => {
return !authenticated;
})
);
}
}
答案 0 :(得分:0)
据我所知,EmptyError表示应该发出某种东西的可观察对象是完整的而不发出任何东西。每当返回false时,takeWhile运算符都会使可观察对象不发出canActivate期望的任何东西。
我认为您需要使用map运算符而不是takeWhile:
canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): Observable<boolean> {
return this.authService.isAuthenticated().pipe(
delay(1000),
repeat(3),
map((authenticated: boolean) => {
return !authenticated;
})
);
}