2016-12-28 29 views
2

我試圖從服務器以塊的形式下載數據。我不知道會有多少次迭代,我只需要獲得塊,直到服務器響應「無數據」爲止。如何在RxJs(v5)中循環?

在v4中有doWhile運營商,但它是實驗性的,並在最新版本中被刪除。

有一個similar question是建議使用expand(雖然我不認爲這是一個重複的!),但我不知道它是否仍然這樣做在V5的最佳或唯一途徑。

或者我正在解決錯誤的問題開始?在這種情況下使用RxJs是一種很好的做法,或者我不鼓勵以這種方式使用它(例如,使用expand運算符實現遞歸,假設沒有更好的方法存在)。

如果這一般不適合Reactive Extensions風格,爲什麼他們刪除了doWhile運算符? (它甚至沒有任何路線圖)

+1

我建議使用'擴大()'很好,但它很難不顯示正是你想解決什麼任何演示提供任何意見。 – martin

+1

注意v5不是第4版的直接後續版本,它是從頭開始完全重新實施的。運營商不存在的事實可能意味着它尚未被移植,或者它被認爲是不必要地膨脹了API表面。這可能會成爲GitHub問題清單中的一個問題。 – paulpdaniels

回答

-1

觀察者的完整功能,它用於結束流和防止任何進一步的請求。

在它看起來像這樣的流圖表土地

....

----\---------\---------\---------\-----| 
    \---r| \   \----r| \ 
       \-----r|   \---r| 

,其中主流是可觀察到的可觀察的,當你在沒有更多的數據響應其完成。

你會壓扁高階可觀察到的與switchmap(或mergemap)

0

expand經過輸入第一,隨後本身作爲輸入。重複此過程直到沒有輸入(Observable.empty())。

我在TypeScript中編寫了演示。

interface RSP { 
    header:string; 
    value:string; 
}; 

function requestMaker(numChunk:number) { 
    return() => { 
     numChunk > 0 ? numChunk-- : 0; 
     return Observable.of(numChunk > 0 ? ['CONT', 'value'] : ['END', 'value']).delay(300); 
    } 
} 

let simulateRequest = requestMaker(5); 

simulateRequest() 
    .expand(([header, value]) => { 
     if (header == 'CONT') { 
      return simulateRequest(); 
     } 
     else { 
      return Observable.empty(); 
     } 
    }) 
    .subscribe(
     ([header, value]) => console.log(`NEXT: ${header}-${value}`), 
     error => console.log(`ERROR: ${error}`), 
     () => console.log('completed') 
    ) 

結果:

NEXT: CONT-value 
NEXT: CONT-value 
NEXT: CONT-value 
NEXT: CONT-value 
NEXT: END-value 
completed