我有一个我不知道如何处理的情况。这种情况是长时间拉取Firebase,将一些数据作为可观察的数据返回给ngrx/effects,然后再次调用Firebase删除一些数据,最后将第一个Firebase返回的数据传递给一个Action,以便reducer完成它的工作。
下面是ngrx/effects代码
constructor(private threadsService: ThreadsService, private store: Store<ApplicationState>) {
}
@Effect() newMessages$ = Observable.interval(5000)
.withLatestFrom(this.store.select("uiState"))
.map(([any,uiState]) => uiState)
.do(console.log)
.filter(uiState => uiState.userId)
.switchMap(uiState => this.threadsService.loadNewMessagesForUser(uiState.userId))
.withLatestFrom(this.store.select("uiState"))
.do(console.log)
.switchMap(([messages, uiState]) => this.threadsService.deleteMessagesQueuePerUser(messages, uiState.userId))
.map(messages => new NewMessagesReceivedAction(messages))第一个this.threadsService.loadNewMessagesForUser(uiState.userId)将获得我最终需要用于NewMessagesReceivedAction(消息)的Firebase数据。但是在传递message observable之前,我还需要删除MessagesQueuePerUser,这样下一个间隔将返回empty,因为新消息已经被拉出。但是上面的代码不会工作,结果很糟糕,而且有很多错误:
错误#1:在筛选器之前没有.do(console.log),此代码
.filter(uiState => uiState.userId)将在WebStorm中引发错误-类型“{}”上不存在属性“userId”。)
错误#2:这3行代码不能工作:
// .withLatestFrom(this.store.select("uiState"))
// .do(console.log)
// .switchMap(([messages, uiState]) => this.threadsService.deleteMessagesQueuePerUser(messages, uiState.userId))这3行的想法是继续向下传递可观察到的消息,但我还需要uiState.userId使用以下命令删除Firebase中的一些数据: this.threadsService.deleteMessagesQueuePerUser(messages,uiState.userId)。但是在第一个Firebase列表中可观察到的消息传递不会进入第二个Firebase列表。下面是threadsService代码:
firebaseUpdate(dataToSave) {
const subject = new Subject();
this.sdkDb.update(dataToSave)
.then(
val => {
subject.next(val);
subject.complete();
},
err => {
subject.error(err);
subject.complete();
}
);
return subject.asObservable();
}
loadNewMessagesForUser(uid: string): Observable<Message[]> {
console.log ("We are pulling the server! uid: " + uid);
return this.findMessagesForMessageKeys(this.findMessageKeysPreUserUnread(uid));
}
findMessagesForMessageKeys(messageKeys$:Observable<string[]>): Observable<Message[]> {
return messageKeys$
.map(pspp => pspp.map(messageKey => this.db.object('message/' + messageKey)))
.flatMap(fbojs => Observable.combineLatest(fbojs))
}
deleteMessagesQueuePerUser(messages:Observable<Message[]>, uid:string): Observable<Message[]> {
let dataToSave = {};
dataToSave['MessagesQueuePerUser/' + uid] = null;
this.firebaseUpdate(dataToSave);
return messages;
}
findMessageKeysPreUserUnread(uid: string):Observable<string[]> {
return this.db.list('MessagesQueuePerUser/' + uid)
.map(getKeys => getKeys.map(p => p.$key));
}谁能给我指出正确的方向,找出如何组织和编写这篇文章?
更新以澄清。
是的,我有UiState类型的。我真正想要的是从this.threadsService.loadNewMessagesForUser(uiState.userId).获得NewMessages在获得NewMessages之后(因为它是一个可观察的异步操作),我想运行删除操作(更像是副作用中的副作用)。当我触发动作messages(NewMessagesReceivedAction)时,数据应该来自this.threadsService.loadNewMessagesForUser(uiState.userId).希望这件事能澄清一点。
发布于 2017-01-24 05:37:32
我假设你有一个UiState类型。
这是一种方法:
@Effect() newMessages$ = Observable.interval(5000)
.withLatestFrom(this.store.select("uiState"))
.map(([any,uiState]) => uiState)
.filter(uiState => uiState.userId)
.switchMap(uiState => threadsService.loadNewMessagesForUser(uiState.userId)
.switchMap(newMessages => threadsService.deleteMessagesQueuePerUser(newMessages, uiState.userId)
.map(deletedMessages => newMessages)))
.map(messages => ({ type:'MESSAGES_RECEIVED', payload: messages }));https://stackoverflow.com/questions/41812235
复制相似问题