Angular беспорядочные (асинхронные) вызовы webApi

У меня есть текстовое поле, которое при каждом входе вызывает вызов webapi. Проблема в том, что если я напишу в текстовое поле немного быстрее, вызов и ответы на вызов будут беспорядочными.

Например, если я напишу "привет"

  • вызвать с h
  • вызвать с "hel"
  • вызвать с "привет"
  • звонить с "адом"
  • вызвать с "он"

Каждый вызов управляет данными ответа, поэтому у меня есть последние данные относительно слова «он», даже если я написал «привет»

Вот код

HTML

<input type = "text" class = "form-control" [(ngModel)] = "txtSearchModel" (keypress) = "digitSearch($event)">

TS

digitSearch($event)
{
         this.modelService.searchModel(this.txtSearchModel)
         .then(response => {
         if (response && response.Code == 200) {
            //Manage Response.Data
         }
      });
}

Как я могу управлять синхронным вызовом или делать только один вызов, когда пользователь останавливает цифру?

Спасибо

Вам просто нужно изменить событие, используя событие нажатия клавиши вместо нажатия клавиши

Parth Savadiya 05.06.2018 09:24
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
1
47
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуйте использовать событие keyup вместо нажатия клавиши:

<input type = "text" class = "form-control" [(ngModel)] = "txtSearchModel" (keyup) = "digitSearch($event)">

ничего не изменилось, вызов начинается, когда я нажимаю keyUp вместо keydown, но также в этом случае в слове из 5 цифр запускает 5 вызовов асинхронно

Martina 05.06.2018 09:30

когда вы хотите вызвать в службу API?

Parth Savadiya 05.06.2018 09:32

когда пользователь ничего не пишет в течение 1 секунды

Martina 05.06.2018 09:36

поэтому для этого вы можете использовать setTimeout (functioncall (), 1000);

Parth Savadiya 05.06.2018 09:38

Я думаю, что лучший способ вызвать digitSearch - это когда пользователь нажимает клавишу Enter

Parth Savadiya 05.06.2018 09:41

Позвольте нам продолжить обсуждение в чате.

Parth Savadiya 05.06.2018 09:44

Вот рабочий пример jsbin.com/zitemil/18/edit?html,js,output, подробнее см. medium.com/aviabird/…

Parth Savadiya 05.06.2018 11:57

Используйте ngModelChange с обновлением размытия вместо нажатия клавиши, и это вызовет событие только тогда, когда ввод потерял фокус, т.е. следующий элемент сфокусирован. Он будет запущен один раз после завершения ввода.

<input
    type = "text"
    class = "form-control"
    [(ngModel)] = "txtSearchModel"
    [ngModelOptions] = "{updateOn: 'blur'}"
    (ngModelChange) = "digitSearch($event)">

Затем удалите [ngModelOptions] = "{updateOn: 'blur'}", и ваши события станут синхронными.

Goga Koreli 05.06.2018 09:59

Есть ли способ сделать звонок, только если пользователь ничего не пишет в течение 1 секунды?

Martina 05.06.2018 10:47

Да, это debounceTime (1000). Но применяется ли это к наблюдаемому следующим образом: observable $ .pipe (debounceTime (1000));

Goga Koreli 05.06.2018 11:37

вы можете привести мне пример?

Martina 05.06.2018 11:37

Возможно, будет полезно использовать компонент Typeahead, например это.

С помощью этого компонента вы можете использовать оператор debounceTime, а также запускать вызов только с минимальным количеством символов, набранных пользователем, которое вы можете настроить.

Ответ принят как подходящий

В случае задержки изменений ввода используйте Угловые реактивные формы, который лучше всего подходит для этой практики.

import { FormControl } from '@angular/forms';
import { debounceTime } from 'rxjs/operators';
txtSearchControl = new FormControl();
ngOnInit() { 
    this.txtSearchControl
        .valueChanges.pipe(debounceTime(1000))
        .subscribe(x=> this.digitSearch(x));
}
<input type = "text"
       class = "form-control"
       [formControl] = "txtSearchControl">

Другие вопросы по теме