2017-03-20 51 views
0

我有一個服務,MyService,其中有一個方法getList()它返回一個可觀測項目的數組中,像結合觀察到的,承諾

getList(): Observable<Item[]> 

一旦清單中查找,然後將每個項目需要去通過第二種方法MyServicefillItem(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)) 
} 

不幸的是,如果我這樣做,getListWithFilledItems()返回Observable<Observable<Item[]>>,而不是方法,因爲我希望,一個Observable<Item[]>

任何有關如何更改代碼,以便方法getListWithFilledItems()返回Observable<Item[]>的建議,將不勝感激。

回答

1

我覺得不是.map(items => this.fillAll(items))你可以只使用mergeMap()

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

這將訂閱可觀察到從fillAll()返回並重新發射它的價值時,它的準備。

順便說一句,請注意,您並沒有在內部subject上調用complete(),所以Observable鏈沒有正確配置(但在您的用例中它可能不重要)。

+0

我忘了感謝實際上使我的代碼工作的快速響應。我仍然努力瞭解爲什麼mergeMap可以工作,而switchMap不能,但我認識到Rx和Observable是我多年以來遇到的最具智力挑戰和刺激的事情(專業)。 – Picci