У меня есть функция getData, которая делает запрос ajax. Я хочу использовать этот результат запроса ajax при отправке формы для проверки вместе с другой проверкой. Поскольку ajax является асинхронным, я вызываю функцию обратного вызова внутри моей функции успеха.
Теперь я хочу присвоить значение функции обратного вызова переменной javascript для проверки моей формы. Я пытался использовать метод обработчика отправки проверки jquery, но это тоже не работает. Моя функция обратного вызова возвращает желаемый результат, но когда я пытаюсь выполнить console.info переменную, которую я также назначил, она возвращает undefined
Вот мой код
function getData(cb){
$.ajax({
url:'/stops/reason_valid',
method: 'get',
dataType: "json",
success: function(data) {
if (data.reason == '6'){
if (($('.search_of_item1').is(':checked')) || ($('.search_of_item2').is(':checked'))){
$(".searchValidError").hide();
cb(false);
}
else{
$(".searchValidError").show();
cb(true);
}
}
}
})
}
$(".actionstaken_submit").click(function(e){
var validationFailed = false;
var searchValidation = getData(function(cb){
alert(cb);
return cb;
});
console.info(searchValidation);
if ($('.no_validation').is(":checked")){
if ($('.action_validation:checked').length > 1){
$('.noneError').show();
validationFailed = true;
}
else{
$('.noneError').hide();
validationFailed = validationFailed || false;
}
}
if (validationFailed || searchValidation) {
e.preventDefault();
return false;
}
});
Примечание: если я это сделаю, alert(cb) отобразит соответствующее значение, но console.info(searchValidation) вернет неопределенное значение.
вы забыли закрыть апостроф в: url:'/stops/reason_valid,
Я обновил свой вопрос, дело в том, что мой ajax работает нормально, так как в моем предупреждении я получаю значение cb как истинное или ложное в зависимости от условия, я просто могу присвоить значение cb переменной searchvalidation, любая идея о том, как я могу сделай это? @Анацу
Я попытался вернуть cb из моей функции getdata, но это тоже не помогает @Taplar
getData() вызывает метод ajax. Вы пытаетесь рассматривать асинхронную логику как синхронную логику. С возвратом не получится
Возможный дубликат: stackoverflow.com/questions/14220321/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Привет, я меняю код на лету, но вам нужно запустить проверку события щелчка внутри обратного вызова или отложенного метода, как это делается или затем.
Пример:
function getData(){
return $.ajax({
url:'/stops/reason_valid',
method: 'get',
dataType: "json"
})
}
function validate_submit(e){
var validationFailed = false;
var searchValidation = false;
getData(searchValidation,validationFailed)
.done((data)=>{
console.info(data);
if (data.reason == '6'){
if (($('.search_of_item1').is(':checked')) || ($('.search_of_item2').is(':checked'))){
$(".searchValidError").hide();
}
else{
$(".searchValidError").show();
searchValidation = true;
}
}
}).always(()=>{
console.info(searchValidation);
if ($('.no_validation').is(":checked")){
if ($('.action_validation:checked').length > 1){
$('.noneError').show();
validationFailed = true;
}
else{
$('.noneError').hide();
validationFailed = validationFailed || false;
}
}
if (validationFailed || searchValidation) {
e.preventDefault();
alert('oh shit here we go again');
return false;
}
})
return false;
}
$(".actionstaken_submit").click(function(e){
validate_submit(e);
});
Надеюсь поможет =)
Это работает, но по какой-то причине даже после ввода этого кода он отправляет мою форму @stan Chacon
добавить return false вне вызова ajax, это единственный способ
Даже отредактированная версия всегда представляла форму @stan Chacon.
....Since ajax is asynchronous i am calling a callback function inside my success function.
Верно. Но есть проблема. Вы продолжаете терпеть неудачу, когда пишете:
var searchValidation = getData(function(cb){
alert(cb);
return cb;
});
console.info(searchValidation);
Это похоже на то, что вы делаете ту же ошибку: функция асинхронна, как и вызов. Существует более одного подхода к решению вашей проблемы. Я предлагаю вам рассмотреть свойство события jQuery isTrigger. Когда вы создаете событие с .вызывать(), объект события содержит такое свойство.
Следовательно, вы можете изменить свой код на:
$(".actionstaken_submit").click(function (e) {
if (e.isTrigger !== undefined) { // <-- is event risen from .trigger() ?
return;
}
e.preventDefault();
var validationFailed = false;
if ($('.no_validation').is(":checked")) {
if ($('.action_validation:checked').length > 1) {
$('.noneError').show();
validationFailed = true;
}
else {
$('.noneError').hide();
validationFailed = validationFailed || false;
}
}
getData(function (searchValidation) {
console.info(searchValidation);
if (!(validationFailed || searchValidation)) {
$(".actionstaken_submit").trigger('click'); // <-- raise the event
}
});
});
Другое решение может быть основано на запуске события отправки:
$(".actionstaken_submit").closest('form').trigger('submit');
function getData(cb) {
cb($(':checkbox').prop('checked'));
return;
// for debug purposes....
$.ajax({
url: '1.json',
method: 'get',
dataType: "json",
success: function (data) {
if (data.reason == '6') {
if (($('.search_of_item1').is(':checked')) || ($('.search_of_item2').is(':checked'))) {
$(".searchValidError").hide();
cb(false);
}
else {
$(".searchValidError").show();
cb(true);
}
} else {
cb(false); // <------- added.....
}
}
})
}
$(".actionstaken_submit").click(function (e) {
if (e.isTrigger !== undefined) { // <-- is event risen from .trigger() ?
return;
}
e.preventDefault();
var validationFailed = false;
if ($('.no_validation').is(":checked")) {
if ($('.action_validation:checked').length > 1) {
$('.noneError').show();
validationFailed = true;
}
else {
$('.noneError').hide();
validationFailed = validationFailed || false;
}
}
getData(function (searchValidation) {
console.info(searchValidation);
if (!(validationFailed || searchValidation)) {
$(".actionstaken_submit").trigger('click'); // <-- raise the event
}
});
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form >
<input type = "checkbox"> searchValidation?<br/>
<input type = "submit" class = "actionstaken_submit" value = "Submit">
</form>
getData()ничего не возвращает