簡體   English   中英

如何獲得最后發出的Observable

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM