2017-03-07 85 views
3

我試圖創建一個將用戶數據作爲Observable並使用第一個observable的數據添加/合併數據的函數,然後返回所有這些數據作爲一個觀察的,我能做到這一點,但不能在嵌套的觀察到嵌套可觀察對象:將observable添加爲可觀察對象的屬性並展開它

這裏返回操作是返回一個可觀察與可觀察到作爲一個屬性叫做假期

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是mergeMap只是另一個名字這在下面 –

回答

0

由於您使用mergeMap從getUsers - > usersWithHolidays中展開嵌套的observables,因此您只需要額外的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

我已經轉載了這個,angularfire Query並沒有給我任何與「假期」相關的東西,但是用一個測試Observable.from [1,2,3]代替它,確實證明它可以工作,所以謝謝。我將不得不明白爲什麼通過angularfire查詢進行映射沒有任何作用。 – Mangopop

0

我認爲你有一個可觀察的流發射可觀察到的流。聽起來很可怕,但不用擔心,RxJS可以處理這個問題。

頂級可觀察流被稱爲高階可觀察性。正在發射的可觀測量被稱爲內部可觀測量。

爲了獲得從內部可觀察量(而不是內部可觀測量本身)發出的值,應該使用switchMap。

switchMap比flatMap更友好,因爲如果有一個出色的innerObservable,switch map會取消它,而是從最新的內部observable發出。這對於http觀察者來說很方便。

flatMap不會取消先前的流,所以你會發現從所有內部observables發出。

+0

正確答案這是一個好點的使用,但現在看來似乎不會是方便,但是否正確的問題。這一切都取決於用例。 –

相關問題