2017-08-11 34 views
2

我正在使用Express開發Node.js API,使用node-rest-client模塊發出http請求。RxJs - 如何實現並行HTTP請求,當您有可變數量的請求時

要開發的API端點之一是/api/v1/users/:userId,它返回用戶的全部信息,其用戶信息以及有關他所屬部門的詳細信息。

要獲取的信息有這個後端REST服務:

/users/:userId - 返回與用戶信息JSON對象加上部門ID列表,如:

{ "name" : "xxx", 
    "departments" : [1, 5 ,6, 8] 
} 

/departments/:departmentId - JSON對象與部門信息

{ 
    "id" : x, 
    "name" : "xxx" 
} 

/api/v1/users/1的調用需要調用

  1. GET /user/1 - >{ "name" : "user1" , "departments" : [1, ,5 ,7 ,8]}
  2. 獲取部門ID和進行N合來電/departments/deparmentId
  3. 所有的呼叫後,組成了完整的JSON響應並返回。

我想使用RxJs將請求對齊,所以我想這將足夠使用Rx.Observable.zip()

問題是,如果我有一個Observable數組,它的大小不固定,表示每個HTTP請求調用,我該如何調用Observable.zip()

如果數組中元素的個數固定在那裏我woud做這樣的:

var observables = [ obs1, obs2 ]; 

Rx.Observable.zip(observables[0], observable[1], function(...){...}); 

但我不知道有多少觀測也有,所以我怎麼能叫ZIP()?

+0

也許與HTTP結合觀測:// reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-combineLatest? – wostex

+0

https://stackoverflow.com/documentation/rxjs/8247/common-recipes/27973/sending-multiple-parallel-http-requests#t=201708111633312560151 – martin

回答

1

您可以使用從ES6的...操作,

var observables = [obs1, obs2, obs3, ..., obsx]; 
Rx.Observable.zip(...observables, function() {}); 
+1

酷!我要試一下 – codependent

0

另一種方法是使用forkJoin可以接收觀測爲陣列

Rx.Observable.forkJoin([obs1, ..., obsN]).subscribe(...);