除非所有内部可观察到的物体至少发射了1次发射,否则CombineLatest不会发射任何东西

时间:2019-07-02 05:05:36

标签: rxjs

所以说我有这三个可观察物:

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之前,订阅不会创建控制台日志。 每当任何内部可观察对象已发出时,是否可以使用rxjs运算符来产生可观察的发出? 例如,在上面的示例中,我期望第一次按下任何数字键盘1时都将调用console.log,而根本没有按下数字键盘2和3。所以结果应该是这样的:[1,0,0](0s,因为我正在使用startWith(0))。

2 个答案:

答案 0 :(得分:0)

解决方案实际上是将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),
    );

答案 1 :(得分:-1)

startsWith被过滤运算符过滤掉,我建议在这里使用map函数。例如:

const numpad3$ = fromEvent(document, 'keydown')
    .pipe(
        startWith(0),
        map(({ key, code }) => return key === '3' && code === 'Numpad3' ? 1 : 0)
    );

如果符合条件,它将返回一个,否则返回0。