J'utilise angularFire2 pour extraire mes données de Firebase sous forme d'objets Observable. Voici une version simplifiée de mon code avec quelques explications ci-dessous :
this.af.getObservable(`userChats/${this.userID}/`).subscribe((recentConversations) => {
recentConversations.forEach(conversation => {
this.af.getObservableSortByVar(`allChats/${conversation.conversationID}/`, "lastUpdate").subscribe((conversationData) => {
let userKey, lastMessage, lastMessageText, lastMessageSender, lastMessageDate;
for (var i = 0; conversationData.length > i; i++) {
switch (conversationData[i].key) {
case "messages": {
lastMessage = (conversationData[i][Object.keys(conversationData[i])[Object.keys(conversationData[i]).length - 1]]);
lastMessageText = lastMessage.message;
lastMessageSender = lastMessage.sender;
lastMessageDate = lastMessage.date;
}
case "users": {
userKey = conversationData[i].userKey;
}
}
}
this.recentChats.push(this.createConversationObject("username", userKey, lastMessageSender, lastMessageText, lastMessageDate));
});
});
});
Actuellement, je fais un appel à la base de données pour récupérer la liste de toutes les conversations d'un utilisateur.
-
Je reçois un objet Observable de toutes les conversations auxquelles je m'abonne puisque je veux garder les données à jour dans la base de données.
-
J'itère ensuite à travers l'Observable des conversations. Je dois faire un nouvel appel à la base de données pour chaque élément itéré (chaque conversation) afin d'obtenir des informations/métadonnées à son sujet (contenu, senderID, date de la conversation etc.). Ainsi, je me retrouve avec deux Observables - l'un imbriqué dans l'autre et tous deux souscrits.
-
Après avoir obtenu le contenu/métadonnées de la conversation à partir du second observable, je pousse les métadonnées obtenues, en tant qu'objet, dans un tableau appelé "recentChats".
Cela fait l'affaire lorsque j'exécute ce bloc de code une fois (l'appel initial au début du programme). Cependant, lorsque les données de la base de données sont modifiées (le noeud 'userChat' dans la base de données ou le noeud 'allChats', ou les deux !) et que les abonnements sont activés, j'obtiens des appels multiples (répétitifs) de ce bloc de code qui inonde mon tableau avec le même résultat plusieurs fois.
Je reçois des appels inutiles alors que je veux juste un seul appel pour rafraîchir l'information.
Et ainsi, je peux voir que ma logique et ma compréhension des Observables ne sont pas correctes. Quelqu'un peut-il m'expliquer quelle serait la bonne solution pour l'exemple ci-dessus ? Comment puis-je imbriquer les abonnements aux Observables sans avoir des appels répétitifs (les mêmes) ?