我正在构建一个聊天应用程序,当一个新的message
被添加到列表中时,我需要更新包含chat
列表的message
项。
我正在使用AngularFire2,并且拥有Observable
。此Observable
可以完美地按预期动态维护列表。
update
,这会导致列表发生变化,依此类推,从而导致无限循环。
码
以下是Observable
findMessages(chatItem: any): Observable<any[]> {
return this.af.database.list('/message/', {
query: {
orderByChild: 'negativtimestamp'
}
}).map(items => {
const filtered = items.filter(
item => ((item.memberId1 === chatItem.memberId1 && item.memberId2 === chatItem.memberId2)
|| (item.memberId1 === chatItem.memberId2 && item.memberId2 === chatItem.memberId1))
);
return filtered;
});
}
我使用此Observable
findAllMessages(chatItem: any): Promise<any> {
return this.firebaseDataService.findMessages(chatItem).forEach(firebaseItems => {
chatItem.lastMsg_text = 'updated value';
this.firebaseDataService.updateChat(chatItem);
});
}
如您所见,我更新了chatItem
updateChat(chatItem: any): firebase.Promise<void> {
return this.findChat(chatItem).forEach((chatItems: any[]) => {
if (chatItems.length > 0) {
for (let i: number = 0; i < chatItems.length; i++) {
return this.af.database.object('/chat/' + chatItems[i].$key).update({
timestamp: chatItem.timestamp,
negativtimestamp: chatItem.negativtimestamp,
lastMsg_text: chatItem.lastMsg_text,
lastMsg_read1: chatItem.lastMsg_read1,
lastMsg_read2: chatItem.lastMsg_read2
});
}
} else {
this.createChatFromItem(chatItem);
}
});
}
问题
我的困惑在于,我正在更新chats
而不是messages
,那么为什么messages
Observable
会被触发?有没有办法实现这个避免无限循环?
任何帮助表示感谢。
答案 0 :(得分:1)
似乎你可以用更简单的方式处理所有这些...你混合Promises&amp;的方式可观察者感觉有点复杂。
你有没有看过Subject?
简单地说,您可以通过调用
让主题“发布”聊天应用程序中的任何更改yourSubject.next(newChatMessage)
从那时起,从您的应用程序的任何部分订阅该主题,您就可以进行必要的更新。
然后,如果你想更深入地了解国家管理的主题,你可以看看以下内容:
RxJS powered state management for Angular applications, inspired by Redux