2017-01-25 36 views
0

我很困惑將Firebase與ngrx/store集成在一起。由於Firebase具有基於套接字的「實時」更新,所以無論何時更新Firebase,商店數據都已與Firebase數據同步。問題是,我不知道如何收聽Firebase更新並觸發效果/存儲的副作用,以在Firebase和客戶端存儲上進行更多更新。我應該如何處理這個問題的任何建議。現在,我必須使用長時間拉取Observable.interval(5000)策略才能觸發服務功能來查詢Firebase,以確定是否發生更新。該代碼是下面:如何收聽Firebase更新並觸發效果/商店副作用以更新商店狀態?

@Effect() newMessages$ = Observable.interval(5000) 
     .withLatestFrom(this.store.select<UiState>("uiState")) 
     .map(([any,uiState]) => uiState) 
     .debug("We are querying Firebase to see if any update happened...") 
     .filter(uiState => Boolean(uiState.userId)) 
     .switchMap(uiState => this.threadsService.loadNewMessagesForUser(uiState.userId) 
      .take(1) 
      .switchMap(data => this.threadsService.deleteMessagesQueuePerUser(uiState.userId).mapTo(data)) 
     ) 
     .debug("new messages received from server, and deleted temp record from Firebase") 
     .withLatestFrom(this.store.select<UiState>("uiState")) 
     .map(([unreadMessages, uiState]) => new NewMessagesReceivedAction({ 
      unreadMessages, 
      currentThreadId: uiState.currentThreadId, 
      currentUserId: uiState.userId 
     })) 

loadNewMessagesForUser和deleteMessagesQueuePerUser是火力AngualrFire2功能。它基本上使用列表來獲取(跟蹤)Firebase上的新更新,並在我們知道自上次5秒以來發生了什麼新更新時,刪除Firebase上的跟蹤數據。我很想刪除該邏輯並直接聽取firebase的更新並觸發我的副作用。

回答

1

理論uiState更改時,應該觸發連續更新並切換到新更新流。

@Effect() newMessages$ = this.store.select<UiState>("uiState") 
     .debug("We are querying Firebase to see if any update happened...") 
     .filter(uiState => Boolean(uiState.userId)) 
     .switchMap(uiState => this.threadsService.loadNewMessagesForUser(uiState.userId) 
      .do(() => this.threadsService.deleteMessagesQueuePerUser(uiState.userId).subscribe()) 
      .map(unreadMessages => new NewMessagesReceivedAction({ 
       unreadMessages, 
       currentThreadId: uiState.currentThreadId, 
       currentUserId: uiState.userId 
      }) 
     ) 
     ) 
     .debug("new messages received from server, and deleted temp record from Firebase"); 
+0

。做(()=> this.threadsService.deleteMessagesQueuePerUser(uiState.userId).subscribe())可以indepentently的loadNewMessagesForUser結果的操作?這是不是意味着.do就像switchMap內的一個側面動作?如果刪除失敗,如果我需要監聽.do進行錯誤處理,該怎麼辦? –

+0

您只需用switchMap替換do,然後將catch直接鏈接到deleteMsgQPerUser – olsn