2017-06-19 6 views
0
this.groupChatsSub = CEChats.find({ 
    group: {$in: groupIds} 
}) 
.mergeMap(list => Observable.from(list)) 
.flatMap((chat: any)=> { 
    return this.findLastChatMessage(chat._id, chat.lastMessage).map(lmsgsub=> { 
     console.log('lmsgsub', lmsgsub) 
     if(lmsgsub) { 
      chat.lastMessage = lmsgsub; 
      chat.unseen = !lmsgsub.seenBy.some((x)=>x==this.user._id); 
      if(chat.unseen) { 
       this.groupChatUnseen++; 
      } 
     } else { 
      chat.unseen = false; 
     } 
     return chat; 
    }) 
}) 
// .map((sub)=> { 
// console.log(sub); 
// return sub; 
// }) 
.mergeAll(); 

Ich versuche, meine beobachtbare Pipe korrekt funktionieren zu lassen.Observable wieder in ein Array einbinden

Die Suche gibt einen Array aus meiner Datenbank

ich das Array in eine beobachtbaren Array machen mergeMap so dass ich jedes der Objekte in dem Array im nächsten Schritt zugreifen kann.

Ich dann flatMap, um jedes der Array-Elemente zu verarbeiten, die übergeben werden, die eine andere Funktion, die eine Observable zurückgibt, wenn das und ich tun, was ich tun muss, um das einzelne Objekt.

Die auskommentierte Karte druckt alle einzelnen Objekte korrekt, wie ich es erwarte.

Ich versuche dann, alle einzelnen Objekte wieder in ein Array zu verschmelzen (das scheint nicht zu funktionieren).

Wie bekomme ich alle Objekte zurück in ein Array? Und schreibe ich andere Arten von Karten anstelle der FlatMap? (ConcatMap und mergeMap scheinen beide genau das Gleiche zu tun, wenn ich es anstelle des flatMap hinzufügen)

~ bearbeiten

Nach dem Picci Antwort mit unter ich es so weit geändert, die recht gut zu sein scheint zu funktionieren.

this.groupChatsSub = CEChats.find({ 
    group: {$in: groupIds} 
}) 
.mergeMap(listChats => { 
    console.log('listy chats', listChats) 
    let myArrayOfChats = []; 
    let myArrayOfObservables = new Array<any>(); 
    for (let chat of listChats) { 

     console.log('IN TEH FOR EACH'); 
     myArrayOfChats.push(chat); 
     myArrayOfObservables.push(
      this.findLastChatMessage(chat._id, chat.lastMessage).map(lmsgsub=> { 

       console.log('lmsgsub', lmsgsub) 
       if(lmsgsub) { 
       chat.lastMessage = lmsgsub; 
       chat.unseen = !lmsgsub.seenBy.some((x)=>x==this.user._id); 
       if(chat.unseen) { 
        this.groupChatUnseen++; 
       } 
       } else { 
       chat.unseen = false; 
       } 
      }); 
     ); 
    }; 
    return Observable.combineLatest(myArrayOfObservables).map(()=> myArrayOfChats); 
}) 

Antwort

1

Ich gehe davon aus, dass schließlich Sie eine beobachtbare haben wollen, die das Array emittiert, sobald alle findLastChatMessage ausgeführt wurden.

Wenn dies der Fall ist, würde ich etwas in dieser Richtung versuchen

this.groupChatsSub = CEChats.find({ 
    group: {$in: groupIds} 
}) 
.mergeMap(list => { 
    const myArrayOfChats = []; 
    const myArrayOfObservables = new Array<Observables>(); 
    for (let chat of list) { 
    myArrayOfObservables.push(this.findLastChatMessage(chat._id, chat.lastMessage).map(lmsgsub=> { 
     myArrayOfChats.push(chat); 
     console.log('lmsgsub', lmsgsub) 
     if(lmsgsub) { 
      chat.lastMessage = lmsgsub; 
      chat.unseen = !lmsgsub.seenBy.some((x)=>x==this.user._id); 
      if(chat.unseen) { 
       this.groupChatUnseen++; 
      } 
     } else { 
      chat.unseen = false; 
     } 
    }); 
    return Observable.combineLatest(myArrayOfObservables).map(() => myArrayOfChats); 
    } 
}) 

Die ganze Idee ist es, eine Reihe von Observablen zu erstellen und als über den combineLatest Betreiber erhalten eine Observable, die einmal alle aussendet Observables, die in dem Array von Observables enthalten sind, haben emittiert.

Der letzte Kartenoperator wird verwendet, um das Array von Chats zurückzugeben.

HAFTUNGSAUSSCHLUSS: Ich bin nicht ganz sicher, dass der Code korrekt ist, da ich nicht ein echter Test bauen haben, sondern einfach die Begriffe zusammengestellt, die ich denke, sind relevant

PS: flatMap wurde als mergeMap umbenannt, so dass die 2 Die Operatoren sind die gleichen

+0

Danke, ich musste einige Änderungen daran vornehmen, wie Sie in Ihrem Disclaimer gesagt hatten, aber es hat mich definitiv auf den richtigen Weg gebracht. danke nochmal: D speziell für den Tipp über FlatMap und MergeMap –

Verwandte Themen