捕获所有关键输入,直到以响应式编程方式按下 ENTER

Capture all key inputs until ENTER is hit in a reactive programming way

本文关键字:响应 编程 方式按 ENTER 输入      更新时间:2023-09-26

在Javascript中使用Kefir,我想捕获所有关键输入,直到命中ENTER。到目前为止,我已经设法使用诸如 bufferWhile

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), "");

但是我该怎么做:

  1. 命中ENTER时输出累加器?
  2. 重新启动累加器以启动新的击键序列?

本质上,如何使用scan和单个流来撰写bufferWhile?答案不一定是关于开菲尔的,任何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$);