Программная проверка даты, возвращающая асинхронный? (JQuery Formvalidator)

У меня есть форма с текстовым полем, заполненная функцией datepicker(), которую я пытаюсь программно проверить в обработчике события нажатия кнопки:

var formValid = true;

console.log( Date.now() + ' initial value: ' + formValid );

$('#expiryDate').validate(function(valid,elem){
    if(!valid){ formValid = false; }
    console.log( Date.now() + ' in expiryDate validate: ' + formValid );
});

console.log( Date.now() + ' after expiryDate validate: ' + formValid );

$('#documentName').validate(function(valid,elem){
    if(!valid){ formValid = false; }
    console.log( Date.now() + ' in documentName validate: ' + formValid );
});

console.log( Date.now() + ' after documentName validate: ' + formValid );

if(!formValid){
    console.log( Date.now() + ' no post...' );
    $('.btn').prop('disabled' ,false );
    return;
} 

console.log( Date.now() + ' would post now...' );

//$.post();

Проверка для documentName возвращается правильно и синхронно. Тем не менее, проверка для expiryDate не делает: formValid по-прежнему имеет значение true, когда он оценивает его, чтобы решить, возвращать ли или делать $.post().

Если я добавлю выходы console.log(), я вижу, что валидатор для поля expiryDate возвращается очень хорошо после того, как код уже выполнил $.post().

В результате данные передаются через $.post (), даже если проверка не пройдена.

Что мне не хватает?

Вот результаты console.log() (числа представляют собой счетчик тиков для проверки времени; true/false относится к значению formValid):

1526495506879 initial value: true
1526495506881 after expiryDate validate: true
1526495506882 in documentName validate: true
1526495506883 after documentName validate: true
1526495506883 would post now...
1526495507084 in expiryDate validate: false
1526495507086 in expiryDate validate: false

1 ответ

Что произойдет, если вы вложите одну проверку в обратный вызов другой, а затем запрос на отправку внутри внутреннего обратного вызова проверки, например, так:

var formValid = true;

console.log(Date.now() + ' initial value: ' + formValid);

$('#expiryDate').validate(function (valid, elem) {
    if (!valid) { formValid = false; }
    console.log(Date.now() + ' in expiryDate validate: ' + formValid);

    $('#documentName').validate(function (valid, elem) {
        if (!valid) { formValid = false; }
        console.log(Date.now() + ' in documentName validate: ' + formValid);

        if (!formValid) {
            console.log(Date.now() + ' no post...');
            $('.btn').prop('disabled', false);
        } else {
            console.log(Date.now() + ' would post now...');
            //$.post();
        }
    });
});
Другие вопросы по тегам