首页 > 解决方案 > combineLatest 不会发射任何东西,除非所有内部 observables 都发射了至少 1 次发射

问题描述

所以说我有这 3 个 observables:

const numpad1$ = fromEvent(document, 'keydown')
.pipe(
    startWith(0),
    filter(({ key, code }) => key === '1' && code === 'Numpad1'),
    map(() => 1),
    scan((a, b) => a + b, 0),
);

const numpad2$ = fromEvent(document, 'keydown')
    .pipe(
        startWith(0),
        filter(({ key, code }) => key === '2' && code === 'Numpad2'),
        map(() => 1),
        scan((a, b) => a + b),
    );

const numpad3$ = fromEvent(document, 'keydown')
    .pipe(
        startWith(0),
        filter(({ key, code }) => key === '3' && code === 'Numpad3'),
        map(() => 1),
        scan((a, b) => a + b),
    );

然后我combineLatest这样使用:

combineLatest(numpad1$, numpad2$, numpad3$).subscribe(console.log)

在小键盘 1、2 和 3 都被按下至少一次之前,订阅不会生成控制台日志。每当任何内部 obersvables 发出时,我可以使用 rxjs 运算符来发出 observable 吗?例如,在上面的示例中,我希望在console.log第一次按下任何 numpad 1 时调用 ,而根本没有按下 numpad 2 和 3 。所以结果应该是这样的:[1,0,0](0s,因为我正在使用startWith(0))。

标签: rxjs

解决方案


解决方案实际上是将 移动startWith(0)到管道的末端。所以:

const numpad1$ = fromEvent(document, 'keydown')
    .pipe(
        filter(({ key, code }) => key === '1' && code === 'Numpad1'),
        map(() => 1),
        scan((a, b) => a + b, 0),
        startWith(0),
    );

推荐阅读