【发布时间】:2018-10-04 07:44:49
【问题描述】:
我有一个服务UserService,它有一个方法getUsers(),这个服务在不同的角度组件之间共享。
该方法调用 API 并返回数据。我想保存最后一次 API 调用的结果/状态,所以我使用BehaviorSubject 来保存最后一个状态,这样如果不同的组件调用getUsers(),应该只有一个 API 调用,否则必须返回保持状态。
这就是我的实现方式
private _users$: BehaviorSubject<User[]>;
constructor(private http: HttpClient) {
this._users$ = new BehaviorSubject([]);
}
getUsers(): BehaviorSubject<User[]> {
if (!this._getUsersState().length) {
this._loadUsers();
this._users$.subscribe(() => {
return this._users$;
});
} else {
return this._users$;
}
}
_loadUsers() {
let _users$ = this.http.get(`${this._context}/users/`);
_users$.subscribe((users: User[]) => {
this._users$.next(Object.assign([], users));
});
}
_getUsersState(): User[] {
return this._users$.getValue();
}
在组件中
this.userService.getUsers().subscribe((users: any) => {
console.log(users);
});
但我收到以下错误
ERROR TypeError: Cannot read property 'subscribe' of undefined
我猜如果长度为 0,get users 会自动返回。
我该如何解决这个问题?这种方法好吗?
【问题讨论】:
-
你能检查一下
this._users$.subscribe是在_loadUser解析observable结果之前还是之后调用的吗?对我来说,问题是您在 _loadUsers 上的 subscribe 函数完成其工作之前执行该函数 -
谢谢,但错误来自组件,即使在
_loadUser之前调用该方法,它也会返回BehaviourSubject所以没有错误。
标签: angular rxjs observable behaviorsubject