最好在服务层的方法中直接返回值而不是 Observable,因为 Observable 通常用于异步数据流。如果非常需要使用 Observable,则应该在服务层内部订阅这个 Observable,执行完操作后再将结果以回调函数的形式传递回组件。
具体的示例代码如下:
不好的写法:
// 在服务层中使用 Observable 返回值
@Injectable({ providedIn: 'root' })
export class UserService {
private user$: Observable;
constructor(private http: HttpClient) {}
getUser(id: string): Observable {
if (this.user$) {
return this.user$;
} else {
const url = `http://api.example.com/user/${id}`;
this.user$ = this.http.get(url).pipe(shareReplay(1));
return this.user$;
}
}
}
// 在组件中使用服务层返回的 Observable
@Component({ ... })
export class UserComponent implements OnInit {
user$: Observable;
constructor(private userService: UserService) {}
ngOnInit() {
this.user$ = this.userService.getUser('123');
}
}
好的写法:
// 在服务层中直接返回值,不使用 Observable
@Injectable({ providedIn: 'root' })
export class UserService {
constructor(private http: HttpClient) {}
getUser(id: string): Observable {
const url = `http://api.example.com/user/${id}`;
return this.http.get(url);
}
}
// 在组件中使用订阅的方式获取服务层的返回值
@Component({ ... })
export class UserComponent implements OnInit {
user: User;
constructor(private userService: UserService) {}
ngOnInit() {
this.userService.getUser('123').subscribe(user => {
this.user = user;
});
}
}
下一篇:不要在服务器响应后发送ACK