Захватите все ключевые вводы до тех пор, пока не будет нажата клавиша ENTER реактивным способом программирования

В Javascript и с использованием кефира я хотел бы захватить все ключевые входы до 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. Перезапустить аккумулятор, чтобы начать новую последовательность нажатий клавиш?

по сути, как ты сочиняешь bufferWhile с помощью scan а единый поток? Ответ не должен быть конкретно о кефире, однако подойдет любой псевдокод FRP.

1 ответ

Решение

Я не уверен, что это то, что вы хотите. В общем, идея состоит в том, чтобы разделить поток подтверждения и выполнения. И объединить это каким-то образом:

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$);
Другие вопросы по тегам