Как прослушать обновление Firebase и запустить эффект/побочный эффект магазина для обновления состояния магазина?

Я очень запутался в интеграции Firebase с ngrx/store. Поскольку Firebase имеет «живое» обновление на основе сокетов, поэтому данные хранилища уже синхронизируются с данными Firebase всякий раз, когда я обновляю Firebase. Проблема в том, что я не знаю, как прослушать обновление Firebase и вызвать побочный эффект с эффектом/хранилищем, чтобы сделать еще несколько обновлений в Firebase и клиентском хранилище. Любое предложение о том, как мне подойти к этой проблеме. На данный момент я должен использовать стратегию длительного извлечения Observable.interval(5000), чтобы вызвать сервисную функцию для запроса 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 — это функция Firebase AngualrFire2. В основном он использует список для получения (отслеживания) новых обновлений в firebase и удаления данных отслеживания в firebase, когда мы знаем, какое новое обновление произошло за последние 5 секунд. Я хотел бы удалить эту логику и просто слушать firebase для обновления напрямую и запускать свой побочный эффект.


person Hugh Hou    schedule 25.01.2017    source источник


Ответы (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");
person olsn    schedule 25.01.2017
comment
.do(() =› this.threadsService.deleteMessagesQueuePerUser(uiState.userId).subscribe()) может работать независимо от результата loadNewMessagesForUser? Означает ли это, что .do является побочным действием внутри switchMap? Что, если мне нужно прослушать .do для обработки ошибок, если удаление не удастся? - person Hugh Hou; 02.02.2017
comment
Вы просто заменяете do на switchMap и связываете перехват непосредственно с deleteMsgQPerUser - person olsn; 02.02.2017