2016-11-23 8 views
1

Firebaseデータベースで複数のシーケンシャルおよび依存クエリを作成しようとしています。rxjsを使用したシーケンシャルおよび依存クエリ

books : { book1: { title: 'Book 1', author: 'author1' } } 
authors: { author1: { name: 'Author 1' } } 

私は、それらを反復処理、すべての書籍を検索し、関連する著者名を取得したいのですが、それぞれのブックオブジェクトに値を設定し、含む観察可能な配列を返す: これは、データベースがどのように見えるかですブックオブジェクト。

私はこの方法で試してみました:

getBooks(): Observable<Book[]> { 
    return this._af.database 
     .list('/books') 
     .flatMap(e => e) 
     .concatMap(e => this.getAuthor(e.author), (a, b) => { 
      a.author = b.lastName; 
      return a; 
     }); 
} 

をしかし、これは最初の本を返します。

アイデア?

+0

'mergeMap()'(エイリアス 'flatMap()') –

+0

あなたはもっと具体的になることができますか? flatMap()、concatMap()、mergeMap()などを使用しようとしましたが、明らかに使用方法はわかりません。 – untemps

+0

もっと具体的になりますか? ;-)質問を編集し、達成しようとしたこと、試したこと、失敗した場所を示すコードを投稿してください。 –

答えて

0

のような配列を返すと、各書籍の著者情報を取得する必要があります。入力書籍の注文保存が出力に必要でない限り、concatMapは必要ありません。この使用して演算子を達成することができない

getBooks(): Observable<Book[]> { 
    return this._af.database 
     .list('/books') 
     .flatMap(booksArr => Rx.Observable.from(booksArr)) 
     .flatMap(
     book => this.getAuthor(e.author), 
     (book,a) => { 
      a.author = book.lastName; 
      return a; 
     } 
    ); 
    } 
+0

書籍は 'flatMap'メソッドのない配列なので、実際は動作しません。 – untemps

+0

ahh list( '/ books')がバニラ配列を返す場合、 'flatMap(booksArr => Rx.Observable.from(booksArr)) 'を使ってそれをobservableに変換する必要があります。観測可能なストリーム。 –

0

、私はObservablecreate()経由でメソッドを作成し、新しい配列を返す前にクエリを実行している:

getBooks(): Observable<Book[]> { 
    return Observable.create(observer => { 
     const res: Book[] = []; 
     this._af.database 
      .list('/books').subscribe(books => { 
      books.map(book => { 
       this.getAuthor(book.author).subscribe(author => { 
        res.push(
         new Book(book.$key, book.title, author.lastName, book.price, book.image) 
        ); 
        if (res.length === books.length) { 
         observer.next(res); 
        } 
       }) 
      }); 
     }); 
    }); 
} 

私が期待したものではありませんが、それは動作すること。

関連する問題