Javascript Observable无限循环

时间:2017-02-17 07:30:37

标签: javascript angularfire2

我正在构建一个聊天应用程序,当一个新的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会被触发?有没有办法实现这个避免无限循环?

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

似乎你可以用更简单的方式处理所有这些...你混合Promises&amp;的方式可观察者感觉有点复杂。

你有没有看过Subject

简单地说,您可以通过调用

让主题“发布”聊天应用程序中的任何更改
yourSubject.next(newChatMessage)

从那时起,从您的应用程序的任何部分订阅该主题,您就可以进行必要的更新。

然后,如果你想更深入地了解国家管理的主题,你可以看看以下内容:

RxJS powered state management for Angular applications, inspired by Redux