2017-01-24 5 views
0

я эта операция для эффекта/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, которые возвращают наблюдаемым. Как бы я построил свои вышеуказанные сервисные методы таким образом, чтобы они возвращали единую эмиссию данных на вызов метода? Как бы я написал иначе, чтобы сделать его более прочным?

ответ

2

Вы можете попробовать это:

.switchMap(uiState => this.threadsService.loadNewMessagesForUser(uiState.userId) 
    .switchMap(data => this.threadsService.deleteMessagesQueuePerUser(uiState.userId).mapTo(data)) 
) 

Если я правильно понял ваш комментарий и loadNewMessagesForUser имеет несколько выбросов (что не является оптимальным случаем, чтобы начать с), вы можете сделать следующее:

.switchMap(uiState => this.threadsService.loadNewMessagesForUser(uiState.userId) 
    .toArray() 
    .switchMap(data => this.threadsService.deleteMessagesQueuePerUser(uiState.userId).switchMapTo(Observable.from(data))) 
) 

Но я настоятельно рекомендую, чтобы вы строили свои сервисные методы таким образом, чтобы они возвращали единую эмиссию данных на вызов метода (если только данные не выбрасываются с течением времени и может не существовать во время вызова метода)

+0

Это дает мне очень странный ответ. Допустим, loadNewMessagesForUser ответит 4 новых сообщения (4 списка Firebase). Но тогда я вижу, что список идет только до 1 (если я добавлю .do (console.log)), и окончательный ответ моего NewMessagesReceivedAction содержит только ОДИН unreadMessages в массиве. Но это должно быть 4 непрочитанных сообщения. –

+0

О, так что 'loadNewMessagesForUser' в основном имеет 4 уровня выбросов данных? – olsn

+0

Загружает все новые сообщения, которые пользователь еще не прочитал. Это список Firebase. Но по какой-то причине ваш код получает только последний. Я думаю, что это b/c наблюдаемого - b/c код, удаляющий их. Я хочу получить все из них, а затем избавиться от него в Firebase. Kinda как уведомление bust ... –

 Смежные вопросы

  • Нет связанных вопросов^_^