[英]How to get last emitted Observable
我創建了一個Angular服務,它基本上用一些用戶信息設置一個對象。 當我更改用戶時,該服務會發出一個可觀察的,由某些兄弟組件捕獲以更新信息。 問題是我第一次設置數據時,還沒有人訂閱,所以我得到一個未定義的值。 我已經閱讀過使用publish()或share()將observable轉換為'hot',但我對RxJS很新,我仍然不知道它是如何工作的100%所以我有點迷失。
服務代碼(相關部分):
getFwcUser() : Observable<FwcUser> {
return this.subjectFwcUser.asObservable();
}
setFwcUser(user : FwcUser) {
this.fwcUser = user;
this.subjectFwcUser.next(this.fwcUser);
}
注意:FwcUser是一個包含一些用戶字段的接口。 我在按鈕處理程序中運行setFwcUser來選擇用戶。
已故用戶(組件代碼):
ngOnInit() {
this.fwcUserService.getFwcUser()
.subscribe(
(user : FwcUser) => { console.log('Received: ', user); this.fwcUser = user; }
);
[......]
}
始終打印:'已收到:未定義'。 注意:該組件位於'* ngIf =“fwcUser”'內,因此當我從兄弟組件調用'setFwcUser'時它被加載。
我怎么能讓這個組件讀取丟失的值?
另外,有人可以為初學者推薦一個很好的資源來學習RxJS嗎? 我正在讀幾本關於Angular4的書,但沒有一本能清楚地解釋清楚......
謝謝!
BehaviorSubject就是這里的答案。 不是標准主題(Observable)只是在它們進入時發出值,而BehaviorSubject會在subscribe()
上發出最后一個值。 您還可以使用BehaviorSubjects getValue()
方法手動獲取最后一個值。
關於下面代碼的一個注意事項是BehaviorSubject聲明中的null
塊表示初始化時BehaviorSubject的初始值。 您可以保留它,也可以使用值預先填充它。
服務
編輯:糾正了幾個打字錯誤。
fwcUser: BehaviorSubject<FwcUser> = new BehaviorSubject<FwcUser>(null);
fwcUser$ = this.fwcUser.asObservable();
// Set the value of the fwcUser
updateFwcUser(user) {
this.fwcUser.next(user);
}
零件
// Subscribe to the BehaviorSubject
ngOnInit() {
this.fwcUserService.fwcUser$.subscribe(_fwcUser => {
this.fwcUser = _fwcUser
}
}
// Get the current (previously emitted) value manually
getFwcUser() {
this.fwcUser = this.fwcUserService.fwcUser.getValue();
}
題? 世界上你如何處理發出的第一個空值? 我有一個behaviorSubject,當我訂閱它時,我首先收到一個null,然后是之后的值。
我如何得到第二個值。
我的服務
user: BehaviorSubject<User> = new BehaviorSubject(null); // The behavior-roles of the user.
authState: any = null; // The object of the user observed.
loginForm: any = false; // Login Popup
signupForm: any = false; // Signup Popup
customToken: any; // Custom Token Variable
provider: any; // Social Provider Type
loginButton: boolean; // Login Button Hidden Y/N
logoutButton: boolean; // Logout Button Y/N
constructor(private afAuth: AngularFireAuth,
private db: AngularFireDatabase,
private router: Router) {
// this.afAuth.authState.subscribe((auth) => {
// this.authState = auth;
// }); // Old Method
this.afAuth.authState
.switchMap(auth => {
if (auth) {
/// signed in
const authData = this.db.list<User>('users/' + auth.uid).valueChanges();
console.log(authData);
return this.db.list<User>('users/' + auth.uid).valueChanges();
} else {
/// not signed in
return Observable.of(null);
}
})
// .subscribe(console.log); // check the subscription
.subscribe((userData) => {
console.log(userData);
this.user.next(userData);
// this.user.next(user);
// console.log(this.user.next(userData));
});
}
我的GuardService
return this.auth.user.map(value => {
const checkValue = _.has(_.get(value, '2'), 'basicUser', true);
if (checkValue === true) {
console.log('Route was true');
return true;
} else if (checkValue === false) {
console.log('Route was False');
}});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.