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的更新並觸發我的副作用。
。做(()=> this.threadsService.deleteMessagesQueuePerUser(uiState.userId).subscribe())可以indepentently的loadNewMessagesForUser結果的操作?這是不是意味着.do就像switchMap內的一個側面動作?如果刪除失敗,如果我需要監聽.do進行錯誤處理,該怎麼辦? –
您只需用switchMap替換do,然後將catch直接鏈接到deleteMsgQPerUser – olsn