порядок выполнения кода с if statment и вызовом ajax - PullRequest
0 голосов
/ 14 января 2019

пожалуйста, посмотрите на мой код, я не понимаю, почему вызывается ajax, даже если я вернул false.

if (isValidationSelected(SaveMapperViewModel)) {
    $.ajax({
        type: "POST",
        url: '/admin/import/validation',
        data: JSON.stringify(SaveMapperViewModel),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
        },
        success: function (response) {
            // do something 
        },
    });
} else {
        console.log(`test`);
    // do something 
}

function isValidationSelected(SaveMapperViewModel) {
    // do something 
    if (result.length != 0) {
        // do something 
        alert(msg);
        return false;
    } else {
        return true;
    }
}

У меня есть точка в контроллере для отладки (ASP.NET Core 2.0 MVC). Когда isValidationSelected возвращает false, происходит отладка на контроллере, и в то же время в консоли браузера появляется сообщение msg с console.log - test. Для целей тестирования я изменяю код следующим образом:

isValidationSelected(SaveMapperViewModel).done(function () {
    $.ajax({
        type: "POST",
        url: '/admin/import/validation',
        data: JSON.stringify(SaveMapperViewModel),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
        },
        success: function (response) {
            //do somoething
        },
    });
});

isValidationSelected(SaveMapperViewModel).fail(function () {
    console.log('test 2');
});

function isValidationSelected(SaveMapperViewModel) {
    var deferred = $.Deferred();
    //do something
    if (result.length != 0) {
        //do something
        alert(msg);
        deferred.fail();
    } else {
        deferred.resolve();
    }
    return deferred.promise();
}

отладка ведет себя так же, как и в первом случае.

Что мне не хватает? Я предполагаю, что речь идет об асинхронности JavaScript, но в этом случае код ведет себя непостижимо для меня. Наверное, я просто чего-то не знаю.

Моя цель - запустить ajax вызов только тогда, когда я верну истину из isValidationSelected.

Спасибо!

EDIT: Для тестирования я изменяю код таким образом, и все же я показываю alert(msg), и ajax запускается. В связи с вопросом ниже, что делает //do something, я вставляю весь несезерный код.

    $('#startImport').on('click', function () {
        var SaveMapperViewModel = createObj(),
            result = [];

        for (var o in SaveMapperViewModel.Pairs) {
            var row = SaveMapperViewModel.Pairs[o];
            if (row.Validation == 0) {
                result.push(row);
            }
        }

        if (result.length != 0) {
            var msg = '';

            for (var i = 0; i < result.length; i++) {
                var row = result[i];
                msg += '"' + row.Value + '" + "' + row.ColOrRow + '" - proszę wybrać rodzaj walidacji \n';
            }

            alert(msg);
        } else {
            $.ajax({
                type: "POST",
                url: '/admin/import/validation',
                data: JSON.stringify(SaveMapperViewModel),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
                },
                success: function (response) {
                    if (response) {

                    } else {
                        errors += "success- ImportMapper start import";
                    }
                },
                error: function () {
                    errors += "error - ImportMapper start import";
                },
            });
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...