当使用.asObservable()函数创建返回值可观察到时,Angular解析器不返回任何值

时间:2019-10-27 19:36:56

标签: angular rxjs

我只是尝试在解析器服务中使用简单的BehaviorSubject和Observable属性来模拟http调用。我不明白为什么以下内容不起作用:

schedule-administration.service.ts:

@Injectable({
  providedIn: 'root'
})
export class ScheduleAdministrationService implements OnInit, Resolve<Observable<SportType[]>> {
  private _sportTypesSubject = new BehaviorSubject<SportType[]>([]);
  sportTypes$: Observable<SportType[]> = this._sportTypesSubject.asObservable();  

  constructor(private leagueAdminService: LeagueAdministrationService) {}

  resolve(): Observable<SportType[]> | Observable<Observable<SportType[]>> | Promise<Observable<SportType[]>> {
    this._sportTypesSubject.next([...])
    return this.sportTypes$;    
  }
}

我认为resolve方法应该订阅返回的observable吗?当我手动执行this.sportTypes$.subscribe(v => console.log(v))时,它会正确记录值。...

1 个答案:

答案 0 :(得分:1)

您的构造所带来的问题是,您最初使用BehaviorSubject。 Angular Router期望您的解析器结果在返回数据之前完成。 因此,使用BehaviorSubject假设您一次只有一个值,但是该值始终可以更改。

要完成这项工作,我认为您只能采用第一个发出的响应/值,例如使用first运算符:

resolve(): Observable<SportType[]> | Observable<Observable<SportType[]>> | Promise<Observable<SportType[]>> {
    return this._sportTypesSubject.asObservable().pipe(first())    
}

根据Angular文档

  

数据提供程序类可与路由器一起使用,以在导航期间解析数据。该接口定义了导航开始时将调用的resolve()方法。 然后,路由器将等待数据解析,然后才最终激活路由。