2017-03-30 68 views
3

我收集可觀察到的所有事件的data陣列:如何在零時間內獲得RxJS可觀察事件?

const obs$ = Rx.Observable 
 
    .interval(500) 
 
    .take(4); 
 

 
let data = []; 
 
const start = performance.now(); 
 

 
obs$.subscribe(
 
    value => { 
 
    data.push({ 
 
     time: performance.now() - start, 
 
     data: value 
 
    }); 
 
    }, 
 
() => {}, 
 
() => { 
 
    console.log(JSON.stringify(data, null, 2)); 
 
    } 
 
);
<script src="https://unpkg.com/[email protected]/bundles/Rx.js"></script>

是否可以「預見未來」,並獲得同樣的data陣列,而無需等待2秒?爲了澄清,我試圖找到一種方法來用某個定製的定時器/調度程序以某種方式打包給定的Observable(上述示例中的obs$),以便我可以立即獲取事件。

+0

我真的不知道你在問什麼。 ['interval'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-interval)以它們之間指定的時間間隔發出一系列整數。如果您希望立即發出整數序列,則可以使用['range'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-range) 。 – cartant

+0

@cartant我試圖找到一種方式來包裝某種給定的Observable('obs $'在上面的例子中)與自定義計時器/調度程序,所以我可以立即得到事件。 –

回答

3

您可以創建一個VirtualTimeScheduler的實例,並可以在interval的調用中指定它。

如果再在訂閱後的調度呼叫flush,該事件將立即發出:

const scheduler = new Rx.VirtualTimeScheduler(); 
 

 
const obs$ = Rx.Observable 
 
    .interval(500, scheduler) 
 
    .take(4); 
 

 
let data = []; 
 
const start = scheduler.now(); 
 

 
obs$.subscribe(
 
    value => { 
 
    data.push({ 
 
     time: scheduler.now() - start, 
 
     data: value 
 
    }); 
 
    }, 
 
() => {}, 
 
() => { 
 
    console.log(JSON.stringify(data, null, 2)); 
 
    } 
 
); 
 

 
scheduler.flush();
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/[email protected]/bundles/Rx.js"></script>

+0

謝謝!這就是我一直在尋找的。唯一的問題是:是否可以採用現有的Observable併爲其注入調度程序? –

+0

不是我所知道的。有['observeOn'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-observeOn)和['subscribeOn'](http://reactivex.io /rxjs/class/es6/Observable.js~Observable.html#instance-method-subscribeOn)運算符,但它們不會更改源observable的調度程序。 – cartant