2017-01-23 76 views
2

基於我想構建forkJoin()方法的函數的參數。Conditional Observable.forkJoin()building

例如:

  • 如果參數1是空=>不把一個http請求爲它 forkJoin()
  • 內如果參數2爲空=>不把一個http請求它 的forkJoin()內

代碼:

getAllByIds(parameter1: any, parameter2: any) { 

    let itemList = new Array(); 

    return Observable.forkJoin(
     this.http.get('rest/fillin/ids/' + parameter1) // don't put this request for parameter1 if it is empty 
     .map((res: Response) => res.json()), 

     this.http.get('rest/textitem/ids/' + parameter2) // don't put this request for parameter2 if it is empty 
     .map((res:Response) => res.json()) 
    ).map(
     data => { 
      itemList.push(data[0]); 
      itemList.push(data[1]); 
      return itemList; 
     } 
    ); 
} 

那麼,是否有可能像這樣構建forkJoin()?

回答

5

實際上,這取決於您在跳過某些HTTP請求時期望得到的結果。

forkJoin()的輸出應該包含null值還是完全忽略它?

function mockHTTPRequest(id) { 
    return Observable.of(id).delay(100); 
} 

let parameter1 = 'a'; 
let parameter2 = false; 

let sources = []; 
if (parameter1) { 
    sources.push(mockHTTPRequest('rest/fillin/ids/' + parameter1)); 
} 
if (parameter2) { 
    sources.push(mockHTTPRequest('rest/textitem/ids/' + parameter2)); 
} 

Observable.forkJoin(...sources) 
    .map(data => { 
    console.log(data.length); 
    return data; 
    }) 
    .subscribe(values => console.log(values)); 

見現場演示:https://jsbin.com/qorulel/5/edit?js,console

這種解決方案只是不會產生源觀測量,如果parameter1parameter2是假的。請注意,根據parameterX值,console.log(data.length)可以從02。您可以創建Observable.of(null)而不是HTTP請求。

function mockHTTPRequest(id) { 
    return Observable.of(id).delay(100); 
} 

let parameter1 = 'a'; 
let parameter2 = false; 

let sources = [ 
    parameter1 ? mockHTTPRequest('rest/fillin/ids/' + parameter1) : Observable.of(null), 
    parameter2 ? mockHTTPRequest('rest/textitem/ids/' + parameter2) : Observable.of(null) 
]; 

Observable.forkJoin(...sources) 
    .map(data => { 
    console.log(data.length); 
    return data; 
    }) 
    .subscribe(values => console.log(values)); 

見現場演示:https://jsbin.com/caheno/5/edit?js,console

現在輸出具有總是2倍的值。其中一些是null

+0

我使用第一種解決方案。它工作正常,但是當'sources'數組不包含任何元素時,我會得到'EXCEPTION:_b is undefined'錯誤。是否因爲我沒有對'sources'數組進行任何空的檢查? –

+1

一個空的數組源應該不成問題。這實際上是一個有效的用例,並經過測試https://github.com/ReactiveX/rxjs/blob/master/spec/observables/forkJoin-spec.ts#L199。你能讓jsbin重現這個問題嗎? – martin

+0

我現在確定它不與空請求數組相關聯。我會看看其他地方。非常有用的評論;) –