所以说我有这三个可观察物:
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)
)。
答案 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。