"fork" 可观察的最佳方法
Best method to "fork" observable
每次 http auth API return 授权用户时,我都需要设置 currentUser: BehaviorSubject<>()
。现在我正在使用 do
将新用户发送到 BehaviorSubject
,但完成这样的任务似乎是一种肮脏的方式。
是否有 fork 方法或类似的东西可以更新观察者和 return 原始观察者?
我有什么
public currentUser: BehaviorSubject<any> = new BehaviorSubject<any>(null);
authUser(email: String, password: String) {
return this.http.post('api.com/auth', {
email: email,
password: password
})
.do(user => this.currentUser.next(user))
}
我想要的
return this.http.post('api.com/auth', {
email: email,
password: password
})
.fork(this.currentUser)
有多种方法可以解决此问题,但我认为您应该使用 subscribe
而不是 do
并且 authUser
不应该 return 任何东西。为什么有两种方式访问同一个东西(当前用户)?
//private field and getter are optional but allows you to expose the
//field as an observable and not a subject
private _currentUser: BehaviorSubject<any> = new BehaviorSubject<any>(null);
get currentUser(): Observable<any> {
return this._currentUser;
}
authUser(email: String, password: String): void {
this.http.post('api.com/auth', {
email: email,
password: password
})
.subscribe(user => this._currentUser.next(user))
}
如果您想进行清理(这是一个异步操作,因此您可能想知道它何时完成),您可以这样做:
authUser(email: String, password: String): Observable<void> {
let requestObs = this.http.post('api.com/auth', {
email: email,
password: password
}).shareReplay();
requestObs.subscribe(user => this._currentUser.next(user));
return requestObs.map(user => null);
}
当然,如果您真的想要 return 值,您可以删除最后一个 map 语句。最后,它与您的 do
.
并没有太大区别
每次 http auth API return 授权用户时,我都需要设置 currentUser: BehaviorSubject<>()
。现在我正在使用 do
将新用户发送到 BehaviorSubject
,但完成这样的任务似乎是一种肮脏的方式。
是否有 fork 方法或类似的东西可以更新观察者和 return 原始观察者?
我有什么
public currentUser: BehaviorSubject<any> = new BehaviorSubject<any>(null);
authUser(email: String, password: String) {
return this.http.post('api.com/auth', {
email: email,
password: password
})
.do(user => this.currentUser.next(user))
}
我想要的
return this.http.post('api.com/auth', {
email: email,
password: password
})
.fork(this.currentUser)
有多种方法可以解决此问题,但我认为您应该使用 subscribe
而不是 do
并且 authUser
不应该 return 任何东西。为什么有两种方式访问同一个东西(当前用户)?
//private field and getter are optional but allows you to expose the
//field as an observable and not a subject
private _currentUser: BehaviorSubject<any> = new BehaviorSubject<any>(null);
get currentUser(): Observable<any> {
return this._currentUser;
}
authUser(email: String, password: String): void {
this.http.post('api.com/auth', {
email: email,
password: password
})
.subscribe(user => this._currentUser.next(user))
}
如果您想进行清理(这是一个异步操作,因此您可能想知道它何时完成),您可以这样做:
authUser(email: String, password: String): Observable<void> {
let requestObs = this.http.post('api.com/auth', {
email: email,
password: password
}).shareReplay();
requestObs.subscribe(user => this._currentUser.next(user));
return requestObs.map(user => null);
}
当然,如果您真的想要 return 值,您可以删除最后一个 map 语句。最后,它与您的 do
.