2017-01-09 14 views
0

このコードは私には役に立ちますが、これがネストされたサブスクリプションを処理するより良い方法であるかどうかは疑問です。ループして別のhttp呼び出しで使用する必要がある配列を取得していますか?これは効率的ですか?ネストされたオブザーバを処理する方法

this.storeService.fetchStores(this.currentCoordinates).subscribe(nearestStores => { 
      nearestStores.forEach(store => { 
       this.stockService.fetchStockResults(ean, store.id).subscribe(stock => { 
        this.stockResults.push({ 
         storeObject: store, 
         ean: stock.ean, 
         ranged: stock.ranged, 
         inStock: stock.quantity > 0 ? true : false 
        } 
        ); 
       }); 
      }); 
     }); 
+2

をあなたは[mer​​geAll](http://reactivex.io/rxjs/class/es6/を使用することができますObservable.js〜Observable.html#instance-method-mergeAll)を使用してコードをより洗練されたものにすることができますが、それはもっと効率的になりません:多くのHTTPリクエストが送信されますコードは非効率的です。 –

答えて

0

その良くは.subscribe()で非同期のアクションを行うどのエラーも可能性がありますしないように。あなたはエラー処理と同時実行制御のようなものを行うことができますので、あなたはより良いこれらの呼び出しは、あなたの受信ストリームに埋め込ま持つことができます。

this.storeService.fetchStores(this.currentCoordinates) 
    .mergeMap(_ => _) /* emit all values from the stores array as separate values in the rx stream */ 
    .mergeMap(
    store => this.stockService.fetchStockResults(store.ean, store.id)) 
     .catch(err => Rx.Observable.of({ ean: -1, range: false, quantity: -1})), 
    (store, stock) => ({ 
         storeObject: store, 
         ean: stock.ean, 
         ranged: stock.ranged, 
         inStock: stock.quantity > 0 ? true : false 
        }), 
    10 /* concurrency; how many in-flight requests do you want?*/ 
) 
    .toArray() 
    .subscribe(stockResults => console.log(stockResults)); 
+0

/*並行性;どのくらいの機内リクエストが欲しいのですか?* /私がその質問を理解しているかどうかわからないので、意見はありません。私は勧告を出してうれしいです。 – user1275105

+0

mergeMap演算子を使用すると、同時にマージするストリームの数を任意に設定できます。これにより、同時実行可能な設定可能な量のhttp呼び出しが効果的に提供されます。完全にあなたのアーキテクチャ/インフラのボトルネックに依存します。何があなたのために働くか見てみましょう(10/50/...?) –

+0

ありがとう、私は実験します。しかし、5行目の文法では苦労しています.2つの引数を取ると思われますが、5行目に余分な閉じ括弧があるようです。 – user1275105

関連する問題