2013-09-30 6 views
0

У меня есть функция AJAX, которая вызывается функцией javascript. Что-то вроде этого:JQUERY AJAX WITH CALLBACK

(CODE1) 
//javascript function calling AJAX. 
var function check(){ 
    var status = chkHoliday(date,'Date Chosen'); 
    alert('called'); 
    return status; 
} 

//AJAX function 
function chkHoliday(date,str){ 
    var flag = true; 
    $.ajax({ 
     type: "GET", 
     url: someurl, 
     async: false,   //if commented, the alert() from the caller function is called before completion of this function. 
     dataType: "json", 
     success: { 
      flag = false; 
     } 
    }); 
    return flag; 
} 

Он хорошо работает. Единственная проблема заключается в том, что, поскольку async установлен в false, вид веб-страницы зависает некоторое время, но затем продолжает действовать дальше.

Чтобы избежать этого я прочитал кое-что о функции обратного вызова, поэтому я попытался это: (КОД 2)

//javascript function calling AJAX. 
var function check(){ 
    var status; 
    chkHoliday(date,'Date Chosen',function(retVal){ 
     status = retVal; 
    }); 
    if(status != null){ 
     alert(status); 
     return status; 
    } 
    else{ 
     alert(true); 
     return true; 
    } 
} 

//AJAX function 
function chkHoliday(date,str,callback){ 
    var flag = true; 
    $.ajax({ 
     type: "GET", 
     url: someurl, 
     //async: false,   //if commented, the alert() from the caller function is called before completion of this function. 
     dataType: "json", 
     success: { 
      flag = false; 
      callback(flag); 
     } 
    }); 
    //return flag; 
} 

это работало, но тревога была вызвана снова перед функцией AJAX может завершить заявив, что «не определено». Я не знаю, что я делаю неправильно.

Я хочу, чтобы функция AJAX должна была дождаться, пока она полностью исполнится, а затем вернется к вызывающей функции и запустит следующие операторы в функции вызывающего абонента с остановкой процесса (т. Е. С использованием async). Также я хочу, чтобы значение, возвращаемое AJAX, должно быть легко доступно для моей функции вызывающего абонента.

+1

Длинный ответ: [Как вернуть ответ от звонка AJAX?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call), короткий ответ: добавьте предупреждения в обратный вызов. – JJJ

+0

Попробуйте использовать плагин blockUI JQuery. http://www.malsup.com/jquery/block/ – nasaa

+0

На самом деле я хочу вернуть значение статуса вызывающей функции. Чтобы упростить, я использовал предупреждения в этом случае! –

ответ

0

Поместите предупреждение внутри функции обратного вызова:

chkHoliday(date,'Date Chosen',function(retVal){ 
     status = retVal; 
     if(status != null){ 
      alert(status); 
     } 
    else{ 
     alert(true); 
    } 
}); 

Но заметьте, вы не можете использовать оператор возврата больше как то, что вы ожидали, потому что это асинхронный.

0

Поскольку AJAX работает асинхронно, проблема заключается в том, чтобы поместить его в функцию и вернуть значение. Чтобы решить эту проблему, отложить с обещанием. Это пообещает результат ajax вызывающему абоненту. Это немного отличается. Вот пример. Работает как прелесть для меня. Конечно, вам нужно будет адаптировать его к вашим потребностям, но все, что вам действительно нужно сделать, это создать свой объект данных.

var data = {} 

function chkHoliday(data) { 
    var deferred = $.ajax({ 
     method: "post", 
     url: ajaxURL, 
     dataType: "json", 
     data: data 
    }); 
    return deferred.promise(); 
} 

chkHoliday(data).done(function (response) { 
    console.log(response); 
} 

возвращение из файла PHP с

echo json_encode(array("success"=>"hello")); 
0

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