Задать вопрос
@stepa90

Как избежать дубликатов запросов AsyncValidator?

Я создал валидатор формы используя эту статью.
@Directive({
    selector: '[instrumentationNameValidator][ngModel],[instrumentationNameValidator][FormControl]',
    providers: [
        {provide: NG_ASYNC_VALIDATORS, useExisting: InstrumentationNameValidator, multi: true}
    ]
})
export class InstrumentationNameValidator implements AsyncValidator {
validatorResult: Observable<ValidationErrors>;
oldValue : string;
    constructor(private http: HttpClient,
                private config: AppConfiguration,
                private user: UserInfoService) {
    }

    validate(control: AbstractControl): Observable<ValidationErrors | null> {
        const params = new HttpParams().set('data', control.value);
       if(this.oldValue != control.value){
       this.oldValue = control.value
        this.validatorResult = this.http.get<boolean>('http:/mysite.com/check', {params})
            .pipe(
                map((isUsed) => {
                    // null no error, object for error
                    return !isUsed ? null : {
                        instrumentationNameValidator: 'Name exists already.'
                    };
                })
            );
       }
        
        return this.validatorResult;
    }
}

у меня стоит ограничение на 10 символов. я добавил к примеру из статьи проверку изменилось значение или нет для того, чтобы если пользователь уже ввел 10 символов и начал тыкать снова запросы не отправлялись с теми же значениями.
и все работает замечательно, пока ответ с сервера успевает прийти до того, как я нажму кнопку еще раз. Т.е. если зажать кнопку я вижу такую картину 5ed11fc614880730232667.png
я добавил finalize(()=>console.log('finalize')) к http запросу и вижу, что не смотря на то, что я явно не вызываю http запрос, валидатор делает это каким то образом за меня. я пробовал добавлять share и в этом случае запрос один, но тогда если значение изменилось и мне теперь действительно нужно новый http запрос, предыдущие не завершается и висят в pending пока не ответит сервер, а мне это не нужно.
Тк на форме есть другие обработчики, которые делал не я, я немогу это решить на уровне формы... мне нужно что-то сделать именно с валидатором. Буду очень рад советам
  • Вопрос задан
  • 47 просмотров
Подписаться 1 Сложный 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы