Вам нужно разделить ваш поток на два потока.
const source = fromEvent(document.getElementById("text"), "input");
source
.pipe(debounceTime(10 * 1000))
.subscribe(() => console.log("saved after typing!"));
source
.pipe(
auditTime(10 * 1000)
)
.subscribe(() => console.log("saved while typing!"));
В первом случае, как вы писали в вопросе, значение debounceTime будет выдано через 10 секунд после того, как пользователь закончит редактирование формы / ввода. Во втором случае, audTime каждые 10 секунд будет проверять наличие нового значения. Если есть, то будет выброшено значение. В обратном вызове вы можете повторно использовать ту же функцию, которая отвечает за сохранение данных из формы. Вы можете попробовать это в этой демонстрации на stackblitz:
https://stackblitz.com/edit/rxjs-jj3kot?file=index.ts
Я только что изменил время в демонстрации на 1 секунду, чтобы было легче проверить результат в консоли.
Примечание:
Это простая JS демонстрация. Если вы разрабатываете приложение Angular, вам следует избегать получения элементов с помощью getElementById. Вместо этого используйте прямую ссылку на шаблон: https://angular.io/api/core/ViewChild
Редактировать:
Согласно комментарию OP, я немного изменил реализацию , Я объединил две наблюдаемые и использовал оператор DifferentUntilChanged, чтобы избежать двойного вывода одного и того же значения. Демонстрация в stackblitz также изменена
const afterTyping = source.pipe(debounceTime(1000));
const whileTyping = source.pipe(auditTime(1000));
merge(whileTyping, afterTyping)
.pipe(distinctUntilChanged())
.subscribe(console.log);