@Mihail_Mel

Как вернуть значение из ajax запроса?

Здравствуйте! Долго втыкал в тему - Как сделать так, чтобы функция выполнялась только ..., но вопросы остались.
Суть такая что при нажатии на кнопку хочу проверить есть ли такие права у пользователя

1. Собственно событие
$("#formsubmit").click(function() {
        // вызов функции проверки
        var id_knopki = 100;
        prov(id_knopki);
       // А вот тут хотел бы получить значение ответ.... от функции prov()
       if(result_add=="1") {  } else {  }
      // но до этой строки выполнение не доходит....
});


2. функция проверки (которая сама по себе отлично работает)
function prov(id_knopki){
	alert("Номер операции - "+id_knopki);
	jQuery.ajax({  
        type: "POST",
        url: "prov_prav_polz.php",   
        dataType:"text",
        data:{"id_knopki":id_knopki},
        cache: false,  
        async:false,
        success:function(response){
            alert(response);
            var result_add = response; 
            if(result_add=="1") { alert("Операция разрешена"); } else { alert("Операция запрещена"); }
        },
        error:function(xhr, ajaxOptions, thrownError){
           alert(thrownError); alert("Ошибка выполнения скрипта");
        }
        });
	return result_add; 
}


Помогите пожалуйста разобраться с данной проблемой.... может что-то забыл?
может конструкция должна быть вроде

$("#formsubmit").click(function() {

		var id_knopki= 100;
    		$.when(prov(id_knopki)).done(function() {
        		 if(result_add=="1") { ...  } else { ... }
    		});


но так тоже не получается.
  • Вопрос задан
  • 4379 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
function prov(id_knopki){
  return jQuery.ajax({ // Будем возвращать deferred-объект
    type: "POST",
    url: "prov_prav_polz.php",   
    dataType:"text",
    data:{"id_knopki":id_knopki},
    cache: false,  
    // async:false, // это плохо, выкидываем
	// эти коллбеки тоже убериаем
    // success:function(response){
    //   alert(response);
    //   var result_add = response; 
    //   if(result_add=="1") { alert("Операция разрешена"); } else { alert("Операция запрещена"); }
    // },
    // error:function(xhr, ajaxOptions, thrownError){
    //   alert(thrownError); alert("Ошибка выполнения скрипта");
    // }
  })
  // Вместо коллбеков будем использовать функциональность deferred объектов
  .done(function(response){
    alert(response);
    var result_add = response; 
    if(result_add=="1") { alert("Операция разрешена"); } else { alert("Операция запрещена"); }
	return response; // Прокинем данные дальше, наружу
  })
  .fail(function(xhr, ajaxOptions, thrownError){
    alert(thrownError); alert("Ошибка выполнения скрипта");
  })
  ;
  // return result_add; // неправильно
}

$("#formsubmit").click(function() {
  var id_knopki = 100;
  prov(id_knopki)
    .done(function(response){
      if(response=="1") {  } else {  }
    });
});


как-то так оно вроде должно работать... я уж не помню насколько там deferred от промисов отличается.

$.when(prov(id_knopki)).done(function() {
if(result_add=="1") { ... } else { ... }
});

Чтобы это работало, функция должна возвращать тот самый deferred объект:
return $.ajax({...})
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Deexter
Берите result_add из замыкания
function prov(id_knopki){
  var result_add = 0; 
  alert("Номер операции - "+id_knopki);
  jQuery.ajax({  
        type: "POST",
        url: "prov_prav_polz.php",   
        dataType:"text",
        data:{"id_knopki":id_knopki},
        cache: false,  
        async:false,
        success:function(response){
            alert(response);
            result_add = response; 
            if(result_add=="1") { alert("Операция разрешена"); } else { alert("Операция запрещена"); }
        },
        error:function(xhr, ajaxOptions, thrownError){
           alert(thrownError); alert("Ошибка выполнения скрипта");
        }
        });
  return result_add; 
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы