首页 文章

如何以同步方式切换MapMap 2 Observable函数,但是要获得第一个可观察的值才能继续?

提问于
浏览
0

我有一个效果/ ngrx副作用的操作:

@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 LIST运算符返回一个Observable,我需要运行其他Firebase选项来删除我从Firebase收到的那些消息 . 然后我将那些Observable传递给NewMessagesReceivedAction .

this.threadsService.deleteMessagesQueuePerUser(uiState.userId)就像副作用中的副作用 . 我需要来自Firebase的消息,但是我还需要在获取后从Firebae中删除它们 . 一切都需要链接在@Effect()......我需要哪个RXJS运算符来完成这项工作?

更新:这是我的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代码 . 我如何以每个方法调用返回一个数据发射的方式构建我的上述服务方法?我如何以不同的方式写作以使其更加稳固?

1 回答

  • 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)))
    )
    

    但我强烈建议您以一种方式构建服务方法,即每次方法调用返回一次数据发送(除非数据随时间发送,并且在方法调用时可能不存在)

相关问题