я эта операция для эффекта/ngrx побочного эффекта:Как я могу переключить функцию Observable синхронно, но получить первое наблюдаемое значение для продолжения?
@Effect() newMessages$ = Observable.interval(5000)
.withLatestFrom(this.store.select<UiState>("uiState"))
.map(([any,uiState]) => uiState)
.filter(uiState => Boolean(uiState.userId))
.switchMap(uiState => this.threadsService.loadNewMessagesForUser(uiState.userId)
**//--How to run below function, which also return an Observable for only indicate success and error.But I need to pass on the Observable from above to continue**
this.threadsService.deleteMessagesQueuePerUser(uiState.userId)
)
.withLatestFrom(this.store.select<UiState>("uiState"))
.map(([unreadMessages, uiState]) => new NewMessagesReceivedAction({
unreadMessages,
currentThreadId: uiState.currentThreadId,
currentUserId: uiState.userId
}))
Моей цели ПОСЛЕ uiState => this.threadsService.loadNewMessagesForUser (uiState.userId), который вернет мне наблюдаемый из списка Firebase, angularFire2 оператор, мне нужно запустить другой вариант Firebase, чтобы удалить те сообщения, которые я уже получил от Firebase. Затем я передаю эти Observable в NewMessagesReceivedAction.
this.threadsService.deleteMessagesQueuePerUser (uiState.userId) - это как побочный эффект внутри побочного эффекта. Мне нужны сообщения из Firebase, но мне также нужно удалить их из Firebae после того, как я их получу. И все нужно связать в @Effect() ... Какой оператор RXJS мне нужно выполнить эту работу?
UPDATE: Вот моя loadNewMessagesForUser служба (uiState.userId) всего:
loadNewMessagesForUser(uid: string): Observable<Message[]> {
return this.findMessagesForMessageKeys(this.findMessageKeysPreUserUnread(uid));
}
findMessageKeysPreUserUnread(uid: string):Observable<string[]> {
return this.db.list('MessagesQueuePerUser/' + uid)
.map(getKeys => getKeys.map(p => p.$key));
}
findMessagesForMessageKeys(messageKeys$:Observable<string[]>): Observable<Message[]> {
return messageKeys$
.map(pspp => pspp.map(messageKey => this.db.object('message/' + messageKey)))
.flatMap(fbojs => Observable.combineLatest(fbojs))
}
Это стандартный код AngularFire2, которые возвращают наблюдаемым. Как бы я построил свои вышеуказанные сервисные методы таким образом, чтобы они возвращали единую эмиссию данных на вызов метода? Как бы я написал иначе, чтобы сделать его более прочным?
Это дает мне очень странный ответ. Допустим, loadNewMessagesForUser ответит 4 новых сообщения (4 списка Firebase). Но тогда я вижу, что список идет только до 1 (если я добавлю .do (console.log)), и окончательный ответ моего NewMessagesReceivedAction содержит только ОДИН unreadMessages в массиве. Но это должно быть 4 непрочитанных сообщения. –
О, так что 'loadNewMessagesForUser' в основном имеет 4 уровня выбросов данных? – olsn
Загружает все новые сообщения, которые пользователь еще не прочитал. Это список Firebase. Но по какой-то причине ваш код получает только последний. Я думаю, что это b/c наблюдаемого - b/c код, удаляющий их. Я хочу получить все из них, а затем избавиться от него в Firebase. Kinda как уведомление bust ... –