如何以同步方式切换Map 2 Observable函数,但获得第一个可观测值以继续



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

@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返回一个Observable,angularFire2 LIST运算符,我需要运行另一个Firebase选项来删除我已经从Firebase收到的消息。然后我把那些可观察的传递给NewMessagesReceivedAction。

this.threadsService.deleteMessagesQueuePerUser(uiState.userId)就像副作用中的副作用。我需要从Firebase发送消息,但我也需要在收到消息后将其从Firebae中删除。所有东西都需要在@Effect()中链接。。。我需要哪个RXJS操作员来完成这项工作?

更新:这是我的loadNewMessagesForUser(uiState.userId)服务all:

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代码,返回一个可观察的。我该如何构建上面的服务方法,使它们每个方法调用返回一个数据发射?我该如何以不同的方式写作,使其更加扎实?

你可以试试这个:

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

但我强烈建议您构建服务方法,使其每个方法调用返回一个单独的数据发射(除非数据是随着时间的推移而发射的,并且在方法调用时可能不存在)

相关内容

最新更新