пожалуйста, посмотрите на мой код, я не понимаю, почему вызывается 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";
},
});
}
});