2017-03-07 19 views
3

私が観察として、ユーザデータをとる関数を作成し、追加/最初に観察からのデータを使用してクエリからのデータをマージしようとしていますが、このすべてを返しますデータ1の観察可能として、私はこれを行うことができますが、ここで ネストされた観測は:観察可能なのプロパティとして、観察を追加し、それをアンラップ

観測可能

のネストされたリターンを操作することはできませんその上にプロパティとして観測可能で観察を返す関数と呼ばれる休日

getAllUsersWithHolidays() { 
    return this.users.map(items => { 
    for (let item of items) { 
    item.holiday = this.af.database.list('Holiday', 
     { 
     query: { 
      orderByChild: 'userIdKey', 
      equalTo: item.$key 
     } 
     } 
    ) 
    } 
    return items; 
}); 
} 

問題があります私は休日に格納されたデータを引き出すように呼び出すときに発生する

this.summary$ = this.UserListService.getUserByEmail().mergeMap(user => { //get the user details to filter by team 
    return this.HolidayService.getAllUserWithHolidays().map(data => { 
    return data 
    .filter(team => team.team === user[0].team) //filters users by team 
    .map(item => { //map over combined data 
     return item.holiday 
     .map(hol => { // Hol is observable, build with property daysTaken 
      return { 
      firstname: item.firstname, 
      surname: item.surname, 
      holiday: hol.reduce((prev, curr) => {prev + curr.daysTaken, 0) //cannot access hol data   
      } 
     });   
    }); 
    }) 
}) 

その後非同期でアンラップ

{{summary$ | async | json}} 

観測可能な休日を超えるマッピングが、私がデータにアクセスすることができないようですか?おそらくまだ私が購読していないからでしょうか?

私はむしろプロパティが、私はむしろそれ最初

を計算しますgetAllUsersWithHolidaysから返されるので、代わりにこの

{user: 'exampleName', holiday:fireBaseListObservable} 

としてこの返す項目の私はすでに計算され、それを返す、観察を持っていないと思います

{ user:'exampleName' , holiday: 20 } 

しかし、これはまた、私の目を逃れていること...

getAllUsersWithHolidays() { 
    return this.users.map(items => { 
    for (let item of items) { 
    item.holiday = this.af.database.list('Holiday', 
     { 
     query: { 
      orderByChild: 'userIdKey', 
      equalTo: item.$key 
     } 
     } 
    ).reduce((prev, curr) => prev + curr.daysTaken, 0) 
    } 
    return items; 
}); 
} 

私はこのようにすることができると思っていましたが、これはまだ観察可能なものを返します。もちろん、私はここで購読して何も​​返すことができません。

+0

flatMapはあなたの友人 –

+0

flatMapは良い点だ –

答えて

0

mergeMapを使用してgetUsers - > usersWithHolidaysからネストされたオブザーバをアンロールする場合は、各ユーザーの休日をアンロールするために追加のmergeMapが必要です。唯一の問題は、ネストしたオブザーバブルがオブジェクトのプロパティであることです。だから我々はそれを処理するためにObservable.from()を使用することができます。

getAllUsersWithHolidays() { 
    return this.users.mergeMap(items => { 
    return Observable 
     .from(items) 
     .mergeMap(item => this.af.database.list(...) 
      .map(holiday => { 
       return { 
        ...item, 
        holiday 
       }; 
      }) 
     ); 
    }); 
} 
+0

私はこれを再現しましたが、天気予報の質問は私に「休日」とは何も返されませんが、これをObservableというテストで置き換えています。[1,2,3]私は角度ファイヤーの質問に対するマッピングが何もしない理由を見なければならないでしょう。 – Mangopop

0

私は観察可能なストリームを観測していると思います。恐ろしいですが、心配しないで、RxJSはこれに対処できます。

トップレベルで観測ストリームが上位を観測可能と呼ばれています。観測されるオブザーバブルはインナーオブザーバブルと呼ばれます。

内部観測(代わりの内側の観測そのもの)から放出された値で取得するには、switchMapを使用する必要があります。

switchMapは、優れたinnerObservableがある場合は、スイッチマップは、それをキャンセルし、代わりに、最新のインナーに観察から放出する、とflatMapよりも優しいです。これはhttp観測に便利です。

flatMapは前のストリームをキャンセルしませんので、あなたはすべての内部の観測から発するがあります。

+0

以下の正解で使用されているmergeMapのためのちょうど別の名前であるが、それは利便性のが、正しさの問題ではありませんようにそれはそうです。それはすべてユースケースに依存します。 –

関連する問題