2017-04-22 1 views
0

url 매개 변수에 null ID가 없으면 getUserDetails 및 getOrganinztion List를 호출하십시오. url 매개 변수에 id가 없으면 getOrganinztion을 호출하십시오. 그러나 문제는 최신을 결합이다는 내가 일을 할 것입니다 rxjs와 같은RxJs Partion if then else

+0

왜 두 번째 combineLatest가 작동하지 않는지는 알 수 없습니다.하지만 첫 번째 항목이 작동하지 않으면 this.userService.getOrganization이 각 결합 최신 버전을 사용하기 때문에 두 번 호출됩니다. 관측통은 추위에있다 - 두 구독. 또한이 팔람은 자주 새로운 매개 변수를 가져야한다. 각 조합에서 getOrganization $은 http와 complete 일 경우 하나의 값만 방출하므로 각 결합이 최대 하나의 값을 방출 함을 의미한다. –

+0

나중에 두 번째 결합 최신이라고도합니다. params (id)가 ngOnInit에서 호출되었습니다. 사용자 생성 및 업데이트 사용자에 대해 동일한 구성 요소를 사용합니다. 동일한 솔루션을 구현하는 더 간단한 방법이 있습니까? 그래서 최신 버전을 하나만 결합하면 페이지 당 하나의 getOrganziation $ 만로드됩니다. – vito

답변

1

뭔가를이 문제를 모델링하는 방법 시나리오 2.

let [updateUser$, createUser$] = this.route.params 
      .map((params: Params) => params['id']) 
      .partition(id => !!id); 


    updateUser$ = updateUser$ 
     .do(() => { 
     this.isEdit = true; 
     }) 
     .flatMap(id => this.userService.getUserById(id)) 
     .map(user => { 

     let languageId = user['languageId']; 
     let organization = user['organization']; 
     let organizationObj = [{ id: organization, text: organization }]; 
     return Object.assign(user, { languageId: [{ id: languageId, text: languageId }] }, { organization: organizationObj }); 
     }); 


    let getOrganization$ = this.userService.getOrganization(); 


    Observable.combineLatest(getOrganization$, updateUser$, (organizationList: any, user: any) => { 
     return { 
     organizationList: organizationList, 
     user: user 
     }; 
    }) 
     .subscribe((data: any) => { 
     // pre populate the form 
     let user = data.user; 
     if (user) { 
      Object.keys(user).forEach(key => { 
      const control = this.userForm.get(key); 
      if (control) { 
       control.setValue(user[key]); 
       control.markAsDirty(true); 
      } 
      }); 
     } 

     this.organizationList = data.organizationList.map(o => o.name); 

     }, err => this.error(err)); 


    Observable.combineLatest(getOrganization$, createUser$, (organizationList: any) => { 
     return { 
     organizationList: organizationList, 
     }; 
    }) 
     .subscribe((data: any) => { 
     this.organizationList = data.organizationList.map(o => o.name); 
     }, err => this.error(err)); 

에 대한 호출되지 않습니다. 더미 관측 값을 http 및 경로 1로 바꿉니다. 이것은 단지 시뮬레이터입니다.

let routes$ = Rx.Observable.create((observer) => { 
    observer.next({id:1}); 
    setTimeout(()=> observer.next({xx:1}), 1000); 
    setTimeout(()=> observer.next({id:2}), 2000); 
    setTimeout(()=> observer.next({xx:2}), 3000); 
    setTimeout(()=> observer.next({id:3}), 4000); 
}); 

let [updateUser$, createUser$] = 
    routes$ 
    .map(params=> params['id']) 
    .partition(id => !!id); 


updateUser$ 
    .switchMap(id=>Rx.Observable.of(`${id}_user`)) 
    .switchMap(user=>Rx.Observable.of('organizationList'), 
     (user, organizationList) => ({user, organizationList}) 
).subscribe(x=>console.log(x)); 

createUser$ 
    .switchMap(id=>Rx.Observable.of('organizationList')) 
    .map(organizationList=> ({organizationList})) 
    .subscribe(x=>console.log(x)); 
+0

덕분에 결합 대신 flatmap을 사용하는 것이 좋습니다. – vito