从 Firebase 列表 Observables 数组转到字符串数组

Posted

技术标签:

【中文标题】从 Firebase 列表 Observables 数组转到字符串数组【英文标题】:Go from Array of FirebaseListObservables to Array of Strings 【发布时间】:2018-05-31 10:26:33 【问题描述】:

编辑以包含更多细节:

假设我在 Firebase 中有一个 SurveyTaker 对象的集合,在 Firebase 中有一个 SurveyTaker 对象的集合,以及一个像这样的surveyTakersBySurvey 关系设置

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

此代码当前有效

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) );

我需要更改上述代码以适用于以相同状态返回的多个调查。

我正在为 rxjs 编程而苦苦挣扎……

//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) );

我得到一个 [未定义,未定义]

任何帮助将不胜感激。如果我需要详细说明任何重要的事情,请告诉我。我还在摸索。

编辑:this.db 来自 ... import AngularFireDatabase from "angularfire2/database";

【问题讨论】:

当你 console.log('stbss') 时,它是否已经在数组的每个元素中包含.$key 它打印两个 FirebaseListObservables 的数组 ... [FirebaseListObservable, FirebaseListObservable] ...我不知道如何打印出来。 如果你使用的是chrome控制台,应该可以展开并看到里面的对象 是的,它是一个像 . 0 : FirebaseListObservable $ref : U u: Qg, path: E, m: lf, Nc: false, then: undefined, ... operator : ObserveOnOperator scheduler: ZoneScheduler, delay: 0 source : FirebaseListObservable _isScalar: false, _subscribe: ƒ, $ref: U _isScalar : false proto : Observable 它似乎是与 this.db.list('foo', query) 相同的对象。 ..我只是不确定如何将它们映射到字符串数组 【参考方案1】:

使用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) );

您可能需要导入这两行。

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

【讨论】:

嗯,你真是太棒了。谢谢你。我还需要添加 .map( stsbs => stsbs.map(results => results[0]).map(stbs => stbs.$key) ); 很高兴听到这个消息。

以上是关于从 Firebase 列表 Observables 数组转到字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 forkJoin 的条件 observables

从登录用户 Flutter/Firebase 获取文档列表

如何从 firebase 数据库参考中获取子节点列表?

RxJava 并行获取 Observables

如何从firebase列表中删除项目

无法从 Flutter 中的 Firebase Firestore 返回列表