2017-02-17 95 views
0

我正在构建一个聊天应用程序,并且当新的message被添加到列表中时,我需要更新包含message列表的chat项目。Javascript Observable无限循环

我正在使用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,那么为什么messagesObservable被触发?有没有办法实现这个避免无限循环?

任何帮助表示赞赏。

回答

1

好像你可以用一种更简单的方式处理所有这些...你混合Promises的方式& Observable感觉有点复杂。您是否看过Subject

说得非常简单,你可以有一个主题“发布”你的聊天应用程序的任何更改通过调用

yourSubject.next(newChatMessage) 

从此,订阅从应用程序的任何部分是主题,你” d能够进行必要的更新。

然后,如果你想更深入到国家管理的主题,你可以看看下面:

RxJS powered state management for Angular applications, inspired by Redux