2017-03-20 6 views
0

나는 목록이 검색되면, 각 항목 갈 필요 항목의 배열의 관찰 가능한을 반환하는 방법 getList()이있는 서비스, MyService,는 관찰 가능한 및 약속

getList(): Observable<Item[]> 

같은 뭔가를 결합 MyService, fillItem(Item)의 두 번째 방법을 통해.

fillItem(item: Item) { 
    BackEnd.retrieveDetails(item.id) 
      .then(data => item.data = data); 
} 

내가 필요로하는이면 MyService 번 항목의 목록을 방출하는 감시 오브젝트를 반환 할 수 있도록 위의 두 가지 방법을 결합하는 것입니다 :이 방법은 약속을 반환 몇 백 엔드에 요청, 같은 것을 발행 그들 모두는 그들의 데이터로 가득 차있다 (즉, 모든 약속이 일단 해결되면). 내가 그렇게한다면 나는 희망으로 지금까지 시도 무엇

는,,,,

fillAll(items: Item[]) { 
    const promises = []; 
    for (let i = 0; i < items.length; i++) { 
     const item = items[i]; 
     promises.push(this.fillItem(item)); 
    } 
    const subject = new Subject<Item[]>(); 
    Promise.all(promises).then(res => { 
       subject.next(items); 
      }, 
      err => { 
       subject.error(err); 
      }); 
    return subject.asObservable(); 
} 

getListWithFilledItems() { 
    return this.getList() 
       .map(items => this.fillAll(items)) 
} 

불행히도 Observable<Item[]>Observable<Observable<Item[]>>하지 반환 getListWithFilledItems() 방법이 라인을 따라 뭔가입니다.

getListWithFilledItems() 메서드가 Observable<Item[]>을 반환하도록 코드를 변경하는 방법에 대한 제안이 있으면 감사하겠습니다.

.mergeMap(items => this.fillAll(items)) 

fillAll()에서 반환하고 준비가되면 그 값을 reemit 관찰에 가입됩니다

답변

1

내가 대신 .map(items => this.fillAll(items)) 당신은 단지 mergeMap() 사용할 수 있다고 생각합니다.

Btw, 내면 subjectcomplete()을 호출하지 않으므로 Observable 체인이 제대로 처리되지 않습니다 (그러나 유스 케이스에서는 문제가되지 않을 수 있음).

+0

실제로 제 코드 작업을 신속하게 처리해 준 것에 대해 감사드립니다. switchMap이 작동하지 않는 동안 mergeMap이 작동하는 이유를 이해하는 데는 아직 어려움을 겪고 있지만 Rx와 Observables는 내가 수년간 (직업적으로) 가장 지적으로 도전하고 자극적 이었음을 인식합니다. – Picci