2017-03-07 3 views
3

사용자 데이터를 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 좋은 지적이야 –

답변

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

나는 이것을 재현했습니다, angularfire Query는 "휴일"로 되돌려주는 것이 아니라 Observable이라는 테스트로 대체합니다. [1,2,3] 그것이 작동한다는 것을 보여 주므로 감사합니다. 나는 angularfire 질의에 대한 매핑이 아무 것도하지 않는 이유를 알아야 할 것입니다. – Mangopop

0

관찰 가능한 스트림이 관찰 가능을 방출한다고 생각합니다. 끔찍한 소리지만 걱정하지 마세요. RxJS는이 문제를 처리 할 수 ​​있습니다.

최상위 수준의 관찰 가능 스트림을 관찰 가능한 상위 순서라고합니다. 관측 대상물이 방출되는 것을 내부 관측 가능이라고합니다.

inner observables (내부 observables 그 자체 대신)에서 방출되는 값을 얻으려면 switchMap을 사용해야합니다.

switchMap은 flatMap보다 더 친숙합니다. innerObservable이 있으면 switch map이이를 취소하고 대신 최신 inner observable에서 방출합니다. 이것은 HTTP 관측소에서 유용합니다.

flatMap은 이전 스트림을 취소하지 않으므로 모든 내부 관찰 가능 항목에서 방출을 찾습니다.

+0

아래의 정답에 사용되는 mergeMap에 대한 또 다른 이름이지만이 편리하지만, 정확성의 문제가되지 않을 것처럼 보인다입니다. 그것은 모두 유스 케이스에 달려있다. –

관련 문제