Angular服务教程:是否可以在拉英雄前添加消息?

Angular Service Tutorial: Can Message Be Added Before Heroes Are Fetched?

我对Angular服务教程代码有一些疑问:

  1. 下面代码中的TODO注释是什么意思?
  2. 如果我们在这里添加一条消息,是否有可能在提取 HEROES 之前添加消息,因为 Observable 是异步的,我们无法控制它?
  3. 在接收 Observable 的调用者的订阅函数中添加消息会更好吗?
getHeroes(): Observable<Hero[]> {
    // TODO: send the message _after_ fetching the heroes
    this.messageService.add('HeroService: fetched heroes');
    return of(HEROES);
  }

我希望 "HEROES are fetched" 消息仅在实际获取 HEROES 后添加。

你有一些选择取决于你想要什么...一个是把它放在订阅中,但这可能会导致代码重复,因为你订阅 getHeroes() 的任何地方都需要记住添加messageService 行并可能在它发生变化时对其进行修改,如果您真的希望每次调用 getHeroes() 时都发生这种情况,从代码维护的角度来看这并不理想......相反,您可以这样做:

getHeroes(): Observable<Hero[]> {
  return of(HEROES).pipe(tap(() => this.messageService.add('HeroService: fetched heroes')));
}

现在使用 tap 运算符,您已将此 messageService 操作作为流的一部分,但在成功获取英雄之后。或者,此设置也可能有效:

getHeroes(): Observable<Hero[]> {
  return defer(() => {  
    this.messageService.add('HeroService: fetching heroes');
    return of(HEROES);
  });
}

此设置将 messageService 操作放在实际获取英雄之前,但是将操作放在带有 defer 的流中可以保证在实际触发订阅之前不会发生操作,而不是仅在构建流时发生。