2017-01-09 107 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

你可以使用[mergeAll](http://reactivex.io/rxjs/class/es6/ Observable.js〜Observable.html#instance-method-mergeAll)使你的代碼更優雅*,但它不會使它更高效*:你仍然會發送很多HTTP請求,這就是爲什麼代碼效率低下。 –

回答

0

最好不要在.subscribe()中執行異步操作,這可能也會導致錯誤。您可以更好地有這些要求嵌入到的Rx流,所以你可以做錯誤處理之類的東西併發控制:

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行的語法。看起來catch是假設有兩個參數,但看起來你可能在第5行有額外的右括號? – user1275105

相關問題