switchMapTo 在订阅前创建 observable
switchMapTo creates observable before subscription
我正在使用 Date.now() 编写计时器流,但我在理解细节时遇到了问题。
当我使用 switchMap 编写流时,它工作正常,getTestStartTime$()
在 start$ 开始发出事件后被调用。
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();
谢谢。
它提前调用是因为您在构建流时调用该函数。
switchMap
接受一个 函数 当一个新值来自上游时它被调用。该函数的结果被订阅为一个新流。
switchMapTo
接受一个 Observable
来订阅来自上游的每个值。您正在通过调用 getTestStartTime$()
.
创建 Observable
当输出取决于来自上游的值时使用switchMap
,当实际上游值无关紧要且仅用作订阅信号时使用switchMapTo
。
我正在使用 Date.now() 编写计时器流,但我在理解细节时遇到了问题。
当我使用 switchMap 编写流时,它工作正常,getTestStartTime$()
在 start$ 开始发出事件后被调用。
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();
谢谢。
它提前调用是因为您在构建流时调用该函数。
switchMap
接受一个 函数 当一个新值来自上游时它被调用。该函数的结果被订阅为一个新流。
switchMapTo
接受一个 Observable
来订阅来自上游的每个值。您正在通过调用 getTestStartTime$()
.
Observable
当输出取决于来自上游的值时使用switchMap
,当实际上游值无关紧要且仅用作订阅信号时使用switchMapTo
。