Javascript 使用RxJS TestScheduler将多个订阅与一个热可观察的对象进行比较
我有以下Javascript 使用RxJS TestScheduler将多个订阅与一个热可观察的对象进行比较,javascript,system.reactive,rxjs,Javascript,System.reactive,Rxjs,我有以下getPriceStream方法要测试: import Rx from 'rx'; export default class TradingService { constructor() { this.subscribedCcyStreams = {}; } getPriceStream(ccyPair) { let existingStream = this.subscribedCcyStreams[ccyPair];
getPriceStream
方法要测试:
import Rx from 'rx';
export default class TradingService {
constructor() {
this.subscribedCcyStreams = {};
}
getPriceStream(ccyPair) {
let existingStream = this.subscribedCcyStreams[ccyPair];
if (existingStream)
return existingStream;
let newStream = Rx.Observable.create(obs => {
// subscribe to live service here once we have one
var ccyStream = Rx.Observable.interval(500, Rx.Scheduler.default)
.map(_ => this.createFakePrice(ccyPair))
.subscribe(obs);
return () => {
ccyStream.dispose();
delete this.subscribedCcyStreams[ccyPair];
};
})
.replay(1)
.refCount();
return this.subscribedCcyStreams[ccyPair] = newStream;
}
createFakePrice(ccyPair) {
return {
ccyPair: ccyPair,
price: Math.random() + 1,
timestamp: Date.now()
};
}
}
我想测试以下内容是否具有第一个和最后一个生成匹配值的订阅(因为它们具有相同的ccy对,因此应返回相同的热可观察值),而第二个订阅应具有不同的值
tradingSvc.getPriceStream('GBPAUD').subscribe();
tradingSvc.getPriceStream('EURUSD').subscribe();
tradingSvc.getPriceStream('GBPAUD').subscribe();
对于一个订阅,我只需将Rx.Scheduler.default
设置为使用我的TestScheduler
,然后使用类似于以下的内容来运行调度器并记录值:
var testScheduler = new Rx.TestScheduler();
Rx.Scheduler.default = testScheduler;
var results = testScheduler.startScheduler(
() => tradingSvc.getPriceStream('GPBAUD'),
{created: 0, subscribed: 0, disposed: 10000});
但是,我不知道如何对一个函数进行3次单独调用,这将产生2个不同的流。在Rx.NET中,我以前只会正常订阅.subscribe()
这3个调用,将每个订阅的值推送到一个集合中,然后通过使用advanceBy(x)
增量控制共享测试调度器。但是RxJS TestScheduler没有这个选项,我认为这不是推荐的方式
想法?您在哪里发现它不支持
advanceTo
和advanceBy
?它源于VirtualTimeScheduler,所以应该有它们。没有正确阅读源代码,加上JS中缺乏良好的智能感知:)谢谢。你在哪里发现它不支持advanceTo
和advanceBy
?它源于VirtualTimeScheduler,所以应该有它们。没有正确阅读源代码,以及在JS中缺乏适当的智能感知:)谢谢。