2016-12-01 1 views
2

Ich habe den folgenden Code, die für jedes Element Schlüssel eine beobachtbare mit den Artikeldetails zurück:ein Array/Objekt zurück, statt eines beobachtbaren mit RXJS Karte

this.list = this.af.database.list("API_URL") 
     .map((ItemKeys) => { 
     return ItemKeys.map((ItemKey) => { 
      return this.af.database.object(API_URL + "/" + ItemKey); //I need this as the object (not observable) 
     }); 
     }).subscribe((items) => { 
     this.lineData = items; //A list of observables 
     }); 

Der Code jedes Element Schlüssel itereates über und wird die Artikeldaten von einem anderen Endpunkt. Das Problem ist, dass es eine beobachtbare Objektdaten zurückholt, und ich brauche es in einem Objekt (das beobachtbare Ergebnis).

Ich habe versucht, das Abonnement Ergebnis mit dem folgenden Code zurück, aber dann alle meine Artikel Daten sind leer (undefined):

this.list = this.af.database.list("API_URL") 
     .map((ItemKeys) => { 
     return orderItemKeys.map((ItemKey) => { 
      this.af.database.object("API_URL" + "/ItemKey.$key) // So I tried to subscribe to this.. 
      .subscribe((data) => { 
      return data; 
      }); 
     }); 
     }).subscribe((items) => { 
     this.lineData = items; // A list with undefined items 
     }); 

Wie ich das Element Datenobjekt als Objekt zurückgeben kann und nicht als beobachtbare von einem Objekt in meinem Fall?

Antwort

0

Sie sollten map durch die flatMap ersetzen, da es in der Lage ist Observable<Observable<T>> zu glätten.

var responseStream = requestStream 
    .flatMap(function(requestUrl) { 
     return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl)); 
}); 

responseStream.subscribe(() => {}); 

Der Versuch, den Code zu diesem Grundsätzlich

const databaseList =() => Rx.Observable.from(['a6b54x4', '1e23sa4q']); 
const databaseObject = (id) => Rx.Observable.of({ id, status: 'ok' }) 

databaseList() 
    .flatMap(x => databaseObject(`id/${x}`)) 
    .reduce((x, y) => x.concat(y), []) 
    .subscribe(console.log); 

anzupassen und zu vereinfachen, flacht es Observable<Observable<T>> noch und dann Reduktion mit verschmilzt alles zu einer Ergebnismatrix.

https://jsfiddle.net/6pLpo3cp/

+0

Entschuldigung, diese Antwort hat keine Ahnung, wie ich 'flatMap' in meinem Fall verwenden kann, wo und wie. Ich habe versucht, meine erste '.map' zu' .flatMap' zu ändern, aber es hat es nicht gemacht. – TheUnreal

+0

@TheUnreal, tut mir leid mein schlechtes. War nicht zu nachdenklich. Schau, ob das hilft oder nicht. –

0

Sie ein Abonnement nicht zurück (von subscribe) innerhalb eines Bedieners. Das ist wahrscheinlich nicht, was du vorhast.

Für den inneren Teil, wo Sie eine Liste von Objekten abrufen, sollten Sie in der Lage sein, ein Array von Observablen aus Array#map() in eine höherwertige Observable mit Observable#from() zu verwandeln. Sie benötigen mergeAll(), um diese Serie von Observablen zurück zu einem einzigen Stream zu bringen, und dann alle ausgegebenen Elemente in einem Array mit toArray() zu sammeln. Dann extrahieren Sie die letzte beobachtbare mit mergeMap().

this.list = this.af.database.list("API_URL") 
    .mergeMap((ItemKeys) => { 
    return Observable.from(ItemKeys.map((ItemKey) => { 
     return this.af.database.object(API_URL + "/" + ItemKey); 
    })).mergeAll().toArray(); 
    }) 
    .subscribe((items) => { 
    this.lineData = items; 
    }); 
+0

Ich denke, 'lineData' wird immer noch eine Reihe von Observablen zurückgeben, wenn Sie eine Observable zurückgeben:' return this.af.database.object (API_URL + "/" + ItemKey); '. Ich muss das Ergebnis jedes Observablen zurückgeben. Wie auch immer, ich habe gerade Ihren Code getestet, und 'this.lineData' ist leer und nicht erreicht (Ich habe ein Konsolenprotokoll in das Abonnement geschrieben und nichts zeigt) – TheUnreal

+0

Die' toArray() 'Methode wurde entfernt und meine Observables werden nicht als Array zurückgegeben (während in meinem code es retrows sie als ein array aber ich brauche sie nicht beobachtbar ..) – TheUnreal

+0

@TheUnreal aktualisiert die Antwort, weil toArray innerhalb der inneren mergeMap sein muss, da list() nie abgeschlossen wird. –

Verwandte Themen