2016-12-02 75 views
0

嗨,我開始RxJS,我有下一個問題的解決辦法,但我不喜歡它,希望你能提供更好的解決方案:RxJS如何在可觀察對象之間切換和暫停?

試想一下,我們有2個數據流,我們要切換:

  • 請求
  • 超時

然後,我們要在它們之間進行切換,但一當其他有一個事件重新開始,這已暫停。例如。我們在成功時做出請求,我們做出超時,完成請求時,完成超時等等。

在我的解決方案,我用模擬的時間間隔要求,我用「可暫停()」,但我不喜歡這個解決方案的可擴展性:

import Rx from 'rx'; 

const requestPauser = new Rx.Subject(); 
const requestStream = Rx.Observable.interval(500).pausable(requestPauser); 
const intervalPauser = new Rx.Subject(); 
const intervalStream = Rx.Observable.interval(500).pausable(intervalPauser); 


requestStream.subscribe(function(){ 
    requestStream.pause(); 
    intervalStream.resume(); 
    console.log("request"); 
}); 
intervalStream.subscribe(function(){ 
    requestStream.resume(); 
    intervalStream.pause(); 
    console.log("interval"); 
}); 

requestStream.resume(); 

如何RxJS專家將解決這個問題?

回答

1

你有問題的答案。 我建議switchMap http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-switchMap

requestStream.switchMap(()=>Rx.Observable.interval(500)); 

我不認爲確實需要一個可暫停。

UPDATE

由於OP需要第二可觀察到的所述第一後啓動,應使用 ConcatMap。

+0

感謝蘇拉傑,有了這個我有一個延遲,但我怎麼可以然後創建一個循環,兩者都重複? const responseStream = Rx.Observable.fromPromise($ .getJSON('https://api.github.com/users')); ()=> {console.log(1);}); (()=> {console_log(2); }); –

+0

對不起,這是錯誤的,因爲第二次訂閱從開始執行,並且必須在第一次完成後執行。 –

+0

好..我的壞..應該仔細看看.. –