捕获所有关键输入,直到以反应式编程方式按下 ENTER
Capture all key inputs until ENTER is hit in a reactive programming way
在 Javascript 中并使用 Kefir,我想捕获所有键输入,直到 ENTER
被击中。到目前为止,我已经设法使用 bufferWhile
like
来做到这一点
var inputValues = Kefir
.fromEvents(document.querySelector('body'), 'keydown')
.bufferWhile(event => event.keyCode!=13);
var result = inputValues.toProperty(() => "");
result
.onValue(x => elm.innerHTML = x.slice(0,-1).map(y => String.fromCharCode(y.keyCode)).join(''))
.onError(() => elm.innerHTML = "?");
但最初我想使用 scan
中的常规
var inputValues = Kefir
.fromEvents(document.querySelector('body'), 'keydown')
.scan((acc, y) => acc.concat(y), "");
但是我怎么办:
- 命中
ENTER
时输出累加器?
- 重新启动累加器以开始新的击键序列?
本质上,您如何使用 scan
和单个流来编写 bufferWhile
?答案不必专门针对 Kefir,任何 FRP 伪代码都可以。
我不确定这是否是您想要的。
一般来说,想法是将确认流和履行流分开。并以某种方式组合它:
const input$ = ...;
const key$ = input$.filter(isNotEnter).map(toChar);
const enter$ = input$.filter(isEnter);
const confirm$ = Kefir.merge([
enter$,
key$.debounce(1000)
]);
key$.bufferBy(confirm$);
在 Javascript 中并使用 Kefir,我想捕获所有键输入,直到 ENTER
被击中。到目前为止,我已经设法使用 bufferWhile
like
var inputValues = Kefir
.fromEvents(document.querySelector('body'), 'keydown')
.bufferWhile(event => event.keyCode!=13);
var result = inputValues.toProperty(() => "");
result
.onValue(x => elm.innerHTML = x.slice(0,-1).map(y => String.fromCharCode(y.keyCode)).join(''))
.onError(() => elm.innerHTML = "?");
但最初我想使用 scan
中的常规
var inputValues = Kefir
.fromEvents(document.querySelector('body'), 'keydown')
.scan((acc, y) => acc.concat(y), "");
但是我怎么办:
- 命中
ENTER
时输出累加器? - 重新启动累加器以开始新的击键序列?
本质上,您如何使用 scan
和单个流来编写 bufferWhile
?答案不必专门针对 Kefir,任何 FRP 伪代码都可以。
我不确定这是否是您想要的。 一般来说,想法是将确认流和履行流分开。并以某种方式组合它:
const input$ = ...;
const key$ = input$.filter(isNotEnter).map(toChar);
const enter$ = input$.filter(isEnter);
const confirm$ = Kefir.merge([
enter$,
key$.debounce(1000)
]);
key$.bufferBy(confirm$);