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