我正在使用Date.now()编写一个计时器流,但是我不太理解一个细节。
当我使用switchMap编写流时,它可以正常工作,并且在start$开始发出事件后调用getTestStartTime$()。
谢谢。
当我使用switchMap编写流时,它可以正常工作,并且在start$开始发出事件后调用getTestStartTime$()。
let start$ = Observable.fromEvent(document.querySelector('#start'), 'click');
let stop$ = Observable.fromEvent(document.querySelector('#stop'), 'click');
let getTestStartTime$ = () => Observable.of(Date.now())
.delay(sampleTime)
.repeat()
.takeWhile(val => true);
let time$ = start$
.switchMap(event => getTestStartTime$())
.map(startTime => Date.now() - startTime)
.map(diff => diff / 1000)
.takeUntil(stop$)
.repeat();
但是,当使用switchMapTo替换switchMap时,似乎在start$触发之前就调用了该函数。我可以看到这一点,因为Date.now()被过早地调用了(它的时间与页面加载的时间相同)。
let time$ = start$
.switchMapTo(getTestStartTime$()) // this calls getTestStartTime$ too early
.map(startTime => Date.now() - startTime)
.map(diff => diff / 1000)
.takeUntil(stop$)
.repeat();
谢谢。