Как сделать проверку AJAX синхронно - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть мастер / форма, использующая JQuery Steps для добавления клиента на наш внутренний веб-сайт, и мне нужно проверить адрес электронной почты / телефона / сервера имен для проверки уже существующих клиентов. PHP возвращает количество совпадений. Если они не существуют, JQuery Steps имеет событие onStepChanging , которому требуется возвращаемое значение true, чтобы позволить ему перейти к следующему «шагу» (естественно, возвращает false).

Я использовал 'async:false' в своем Ajax-запросе, который работает, но я получаю предупреждение об его устаревании, и в этом случае мне нужно, чтобы он выполнялся синхронно. Я хочу сделать это правильно и следовать рекомендациям, особенно если «async: false» не рекомендуется. По-видимому, он будет устаревшим, чтобы улучшить взаимодействие с пользователем, не замораживая процессы.

Если я удаляю «async: false», то когда я вызываю свой checkExisting (), я всегда получаю 0, потому что он не будет обновлять мою переменную «совпадения», так как она работает асинхронно, и я понимаю это, но мне нужно вернуть количество совпадений.

Я пытался изменить свой AJAX и вернуть AJAX1, затем сделал

.
checkExisting(..).done(function(){... return true})

но, похоже, это тоже не работает и возвращает [object Object]. Он возвращает меня из .done (), но не передает этот возврат true / false в onStepChanging: function () {...}

Обычно я делал бы что-то вроде

validateThing().done(function() {
    // if invalid, add a red border around the input
    // add validation message
});

Я прочитал несколько ответов, и они, кажется, предлагают реструктурировать ваш код, чтобы улучшить взаимодействие с пользователем. Некоторые предлагали вернуть ajax и использовать .done () или .then (). Однако я связан с этим событием onStepChanging в jQuery Steps, и мне нужно вернуть true / false.

// this is what currently works with async:false

function checkExisting(email) {

    let matches = 0;
    let ajax1 = $.ajax({
        url: "/includes/pages/organisations/ajax.php",
        type: "GET",
        async: false,
        data: {action: 'checkExisting', value: email},
        success: function(response) {
            const responseData = JSON.parse(response);
            matches =  responseData.matches;
        }
    });

    return matches;
}



// JQuery Steps 
$('#addNewCustomer').steps({

onInit: function() {},
onStepChanging: function(e,currentIndex, newIndex) {

    let stepStatus = false;

    if(checkExisting(customer.email) === 0) {
        // customer exists
        stepStatus = true;
    } else {
        // add validation error message
        // add validation styling
    }

    return stepStatus;
}
...


});

Мне нужно иметь возможность вызывать checkExisting () и заставить его вернуть число. Затем я могу использовать это, чтобы вернуть true / false в JQuery Steps, и я также могу использовать его, чтобы сообщить о количестве совпадающих клиентов в сообщении проверки («3 клиента существуют с этим числом»).

Извиняюсь, если я невероятно плотный, и мне не хватает чего-то очевидного!

Спасибо за ваше время.

...