【发布时间】:2020-09-15 14:57:21
【问题描述】:
据我了解,当您订阅 BehaviorSubject 时,该订阅是异步的。我正在尝试从 BehaviorSubject 中的对象获取值并在 getter 中返回该值。 getter 需要返回类型“数字”。我该如何处理?
下面,我有一个 getter userId,它应该从 BehaviorSubject _loggedInUser 中保存的对象返回用户 ID
export class AuthServiceService {
private _loggedInUser: BehaviorSubject<LoggedInUserData> = new BehaviorSubject(null);
constructor(
private http: HttpClient,
private storage: Storage
) { }
/// This method below!!! --------------
public get userId(): number{
this._loggedInUser.pipe(
take(1),
map(((loggedInUserData: LoggedInUserData) => {
if(loggedInUserData){
return loggedInUserData.user_id
}
return null;
}))
).subscribe((userId: number | null) => {
return userId;
});
}
//// -----------------
public doLogin(loginData: LoginFormData): Observable<any>{
return this.http.post<LoggedInUserData>(`${authURL}/token`, loginData)
.pipe(
catchError(err => {
if(err.status && err.status === 403)
return throwError('The credentials you have entered are invalid or do not exist.');
else
return throwError('There was an issue processing your request.');
}),
tap(respData => {
console.log('LOGGED IN USER DATA: ', respData);
this._loggedInUser.next(respData);
this.storage.set('userData', respData);
})
);
}
public async autoLogin(){
}
public doLogout(){
}
}
【问题讨论】:
-
你试过
_loggedInUser.value.user_id吗? BehaviorSubject 实例有一个value属性,它给出了最新的值。 rxjs-dev.firebaseapp.com/api/index/class/BehaviorSubject -
在这种情况下,我是否应该使用 BehaviorSubject 来保存用户数据?
-
BehaviorSubject 是有目的的。如果您不需要它,请不要使用它。您可以根据需要组合各种 observables。
-
“我是否应该使用
BehaviorSubject来保存用户数据?”如果您需要在组件中访问数据,这将很有用 -
你的用户数据是异步加载的,所以你要问自己:如果有人想访问
userId(),但还没有数据,如果有人在@时收到null,可以吗? 987654328@ 即使在 5 毫秒后出现用户 ID 也会被调用?当我们想要访问数据并且如果它不存在时,我们使用 Observables 等到它存在或对更改的数据做出反应。使用 Observables 意味着从许多函数中返回 Observables,并且仅在我们需要实际数据时订阅。在大多数情况下,您希望userId()返回一个 Observable。
标签: javascript angular ionic-framework rxjs