2017-02-17 101 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