2017-03-20 21 views
0

私はリストが取り出されると、各項目が行く必要がある項目の配列の観測を返すメソッドgetList()を持っているサービス、MyServiceは観測可能と約束

getList(): Observable<Item[]> 

のようなものを持っている組み合わせMyService,fillItem(Item)の第2の方法により決定する。このメソッドは、約束を返すいくつかのバックエンドへの要求を発行し、のようなもの:MyServiceでは、かつてのアイテムのリストを放出する観測を返すことができるように

私は必要なもの
fillItem(item: Item) { 
    BackEnd.retrieveDetails(item.id) 
      .then(data => item.data = data); 
} 

は、上記の二つの方法を組み合わせることですそれらのすべてが彼らのデータで満たされています(つまり、すべての約束が解決されたら)。私がそうするならば、私は期待して私がこれまで試してみました何

は、、、

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()を使用することができます代わりに.map(items => this.fillAll(items))を考える

答えて

1

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

をこれが観測に加入しますがfillAll()から返されると、それは準備ができたときに、その値を再放出します。

Btwでは、を内部でsubjectと呼んでいないので、Observableチェーンが適切に処理されないように注意してください(ただし、使用するケースでは問題は発生しません)。

+0

実際に私のコードの仕事をしてくれたクイックレスポンスに感謝しています。私はまだswitchMapが動作しない間にmergeMapが動作する理由を理解するのに少しでも苦労していますが、RxとObservablesは何年も前から私が(職業的に)遭遇した最も知的に挑戦的で刺激的なものです。 – Picci

関連する問題