EmptyError:在Angular Guard中使用takeWhile时,按顺序没有元素

时间:2018-10-17 09:14:13

标签: typescript rxjs observable angular-cli canactivate

我们有一个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;
      })
    );
  }
}

1 个答案:

答案 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;
  })
);

}