angular - Gå från Array av FirebaseListObservables till Array av Strängar


REDIGERAD FÖR ATT INKLUDERA MER DETALJ:

Låt oss anta att jag har en samling av Survey-objekt i Firebase, och en samling av SurveyTaker-objekt i Firebase, och en surveyTakersBySurvey-relation uppsatt som

+-- surveyTakersBySurvey
   |
   +-- survey1
   |    |
   |    +-- surveyTaker1 = true
   |
   +-- survey2
        |
        +-- surveyTaker1 = true

Denna kod fungerar för närvarande

findSurveyByState(surveyState:string): Observable<Survey> {
    return this.db.list('surveys', {
        query: {
            orderByChild: 'state',
            limitToFirst: 1,
            equalTo: surveyState
        }
    })
    .map(results => results[0]);
}

findSurveyTakerKeysPerSurveyState(surveyState:string,
                           query: FirebaseListFactoryOpts = {}): Observable<string[]> {
    return this.findSurveyByState(surveyState)
        .do(val => console.log("survey",val))
        .filter(survey => !!survey)
        .switchMap(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`,query))
        .map( stsbs => stsbs.map(stbs => stbs.$key) );
}

Jag behöver ändra koden ovan för att fungera för flera undersökningar som returneras med samma tillstånd.

Jag har problem med rxjs-programmering...

//i first changed this to return multiple
findSurveysByState(surveyState:string): Observable<Survey[]> {
    return this.db.list('surveys', {
        query: {
            orderByChild: 'state',
            equalTo: surveyState
        }
    })
    //.map(results => results[0]);
}

// this is the method that is not working
findSurveyTakerKeysPerSurveyState(surveyState:string,
                           query: FirebaseListFactoryOpts = {}): Observable<string[]> {
    //need to update to take multiple Surveys
    return this.findSurveysByState(surveyState)
        .do(val => console.log("surveys",val))
        .filter(survey => !!survey)
        //.switchMap(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`,query))
        // switchMap would only make sense for one at a time?
        .map(surveys => surveys.map(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`, query)))
        // on the below line i get [ts] Property '$key' does not exist on type 'FirebaseListObservable<any[]>'.
        .map( stsbs => stsbs.map(stbs => stbs.$key) );
}

Jag får en [undefined, undefined]

All hjälp skulle uppskattas. Låt mig veta om jag behöver förklara något viktigt.. jag håller fortfarande på att lära mig här.

REDIGERA: this.db är från ... import { AngularFireDatabase } från "angularfire2/database";

Svar #1

Använd combineLatest.

findSurveyTakerKeysPerSurveyState(surveyState:string,
    query: FirebaseListFactoryOpts = {}): Observable<string[]> {
  //need to update to take multiple Surveys
  return this.findSurveysByState(surveyState)
  .do(val => console.log("surveys",val))
  .filter(survey => !!survey)
  //.switchMap(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`,query))
  // switchMap would only make sense for one at a time?
  .switchMap(surveys => {
    let observables = [];
    surveys.forEach(survey => {
      observables.push(this.db.list(`surveyTakersBySurvey/${survey.$key}`, query));
    });
    return Observable.combineLatest(observables);
  })
  .map( stsbs => stsbs.map(stbs => stbs.$key) );
}

Du kan behöva importera dessa två rader.

import 'rxjs/add/observable/combineLatest';
import { Observable } from 'rxjs/Observable';