Angular服务教程:是否可以在拉英雄前添加消息?
Angular Service Tutorial: Can Message Be Added Before Heroes Are Fetched?
我对Angular服务教程代码有一些疑问:
- 下面代码中的TODO注释是什么意思?
- 如果我们在这里添加一条消息,是否有可能在提取 HEROES 之前添加消息,因为 Observable 是异步的,我们无法控制它?
- 在接收 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 的流中可以保证在实际触发订阅之前不会发生操作,而不是仅在构建流时发生。
我对Angular服务教程代码有一些疑问:
- 下面代码中的TODO注释是什么意思?
- 如果我们在这里添加一条消息,是否有可能在提取 HEROES 之前添加消息,因为 Observable 是异步的,我们无法控制它?
- 在接收 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 的流中可以保证在实际触发订阅之前不会发生操作,而不是仅在构建流时发生。