Проще говоря, я хочу выполнить запрос после того, как пользователь перестанет печатать в течение заданного промежутка времени. В каждом уроке, который я видел, используя FormBuilder
, предлагается подписаться на valueChanges
поля ввода, в то же время отправляя по трубам debounceTime
и distinctUntilChanged
.
this.threadForm.get('body').valueChanges.pipe(
debounceTime(500),
distinctUntilChanged(),
mergeMap(search => this.db.query$(...)`))
)
Я не могу заставить это работать правильно. Похоже, что он правильно отбрасывает время, но когда он проходит по каналу, он отправляет кратный конечный результат (который должен обрабатывать DifferentUntilChanged). Что я делаю не так?
Вот краткое видео проблемы (я добавил tap
, чтобы вы могли видеть, что на веб-странице регистрируется несколько окончательных результатов):
https://streamable.com/h2him
Спасибо!
РЕДАКТИРОВАТЬ: Добавление окружающего кода функция source
также запускается при каждом нажатии клавиши, поэтому я думаю, что я создаю несколько наблюдаемых объектов независимо от того, как я отменил. Как я могу добавить логику отладки в этом?
source: (searchTerm, renderList) => {
//searchTerm is triggered on every button click
if (searchTerm.length === 0) {
renderList(this.mentions, searchTerm)
} else {
//are multiple instances of this observable being made??
this.threadForm.get('body').valueChanges.pipe(
distinctUntilChanged(),
debounceTime(500),
tap(x => console.log(x)),
switchMap(search => this.db.query$(`user/collection?like=username_${searchTerm}&limit=5`))
).subscribe( x => {
console.log(x)
});
}
},