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