我正在使用Date.now()编写一个计时器流,我在理解细节方面遇到了问题.
当我使用switchMap编写流时,它工作正常,并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();
Run Code Online (Sandbox Code Playgroud)
但是当用switchMapTo替换switchMap时,似乎在启动$触发之前调用了该函数.我可以看到这个,因为Date.now()太早调用(它与页面加载的时间相同).
let time$ = start$
.switchMapTo(getTestStartTime$()) // this calls getTestStartTime$ too early
.map(startTime => Date.now() - startTime)
.map(diff => diff / 1000)
.takeUntil(stop$)
.repeat();
Run Code Online (Sandbox Code Playgroud)
谢谢.
pau*_*els 21
它正在提前调用,因为您在构建流时调用该函数.
switchMap获取一个函数,当一个新值来自上游时调用该函数.该函数的结果被订阅为新流.
switchMapTo获取Observable订阅的每个来自上游的值.您正在Observable通过调用创建getTestStartTime$().
使用switchMap当输出依赖于从上游来的值,并使用switchMapTo当实际上游值是不相关的,并且仅作为用于订阅的信号.
| 归档时间: |
|
| 查看次数: |
3943 次 |
| 最近记录: |