2017-01-24 2 views
0

다른 휴식 자원을 쿼리하고 결과를 단일 오브젝트로 결합하고자합니다. 그것의 사용자 객체와 모든 사용자는 단일 역할을 포함해야합니다. 나는이 일을 flatMap을 사용할 수 있습니다 읽었습니다,하지만 난 그것이 작동되도록 어차피 : 의사 코드에 대한flatMap을 사용하여 개체를 중첩하는 방법은 무엇입니까?

public getUsers(): Observable<User[]> { 
    var users: Observable<User[]> = this.someService.getUsers('[A_URL]') // returns Observable<User[]> 
    .flatMap(res=> { 
     // for every user call resource 'role' and add it to user object one by one ... 
     // return this.someService.getRoleByUser('[A_URL_WITH_USERID]') 
    }.map(res=>{ 
     //add role to user object 
     // user.role = r; 
    }); 
); 
    return users; 
} 

임 미안 해요,하지만 난 정말 구문을 이해 해달라고. 문제는 두 번째 리소스 호출이 첫 번째 호출에서 모든 사용자의 ID를 필요로한다는 것입니다. 여기

답변

2

당신이 그것을 할 수있는 방법은 다음과 같습니다

// This obs emits a SINGLE array of all users. 
// Analog to what your `.getUsers()` method would return 
const usersArray = Rx.Observable.of([ 
    { id: 1, name: 'user1' }, 
    { id: 2, name: 'user2' }, 
    { id: 3, name: 'user3' } 
]); 

// Obtain the role(s) for a given user. 
const userRoles = function(userId) { 
    return Rx.Observable.of(`Role for user ${userId}`); 
} 

const obs = usersArray 
       // Flatten the array. 
       // Now each user is emitted as an individual value. 
       .mergeMap(val => val) 
       // Fetch user roles 
       .mergeMap(user => { 
       return userRoles(user.id).map(role => { 
        // Put together user + role 
        user.role = role; 
        // DO NOT FORGET to return below 
        return user; 
       }); 
       }) 

       // At this point, you have individual users with a `user.role` property 
       // being emitted in the stream. 

       // Unflatten the array if desired (to obtain a SINGLE array of ALL users) 
       .reduce((acc, curr) => acc.concat(curr), []); 

// Final subscribe 
obs.subscribe(val => console.log(val)); 

JS BIN이 코드를 시연 : http://jsbin.com/vucuga/4/edit?js,console

참고 :

  • flatMap()mergeMap()의 별칭입니다. RxJS 5 (Angular에서 사용)에서는 mergeMap()이 "공식"연산자라고 생각합니다.
  • 사용자의 순서를 유지해야하는 경우 mergeMap() 대신 concatMap()을 사용하십시오.
+0

'flatMap'은 RxJS 5에없는 것 같습니다 :) https://gist.github.com/btroncone/d6cf141d6f2c00dc6b35 – smnbbrv

+0

실제로. 그것이 내가 "메모"에 쓴 것입니다. :) – AngularChef

+0

고맙습니다. 이제는 역할이 사용자의 자산이 아니라고 알려줍니다. 유형을 유지하려면 어떻게해야합니까? – Stefan

관련 문제