2015-06-27 5 views
0

Я создал функцию, которая ниже, я передаю данные и возвращает результат как есть. Я сделал это, потому что мне понадобится много вызовов ajax, и я просто сделал функцию, с которой я передаю данные и получаю результат как есть, и работаю с результатом.JQuery Ajax Call Return

function FunctionsCall(data){ 
var ret; 
$.ajax({ 
type:'GET', 
url: 'includes/helpers/functions.php', 
dataType:"json", 
data: data, 
success: function(result){ 
    ret = result; 
}}); 
return ret;} 

Теперь я звоню туда, где мне это нужно:

$('#register-name, #register-surname').keyup(function(e) { 
var x = FunctionsCall({query: $(this).val(), funcid: 1}); 
(x!==1) ? $(this).addClass('input-has-error') : $(this).removeClass('input-has-error'); }); 

Но странно, что я всегда вижу х, как определено. Указывая, что ret заполняется либо 1, либо 0, я не знаю, почему он не передается x.

Не могли бы вы помочь мне? Это может быть просто, но я просто экспериментирую при необходимости с javascript и jquery.

С уважением

+0

Вы можете добавить свой HTML в вопрос слишком –

+0

лучше не использовать FunctionsCall там, использовать непосредственно Аякс функцию, и в функции успеха добавить или удалить классы в зависимости от значения в отставке – Geomorillo

ответ

1

ret не приготовьтесь, пока функция успеха не работает, что когда Аякс заканчивается. FunctionCall возвращает сразу же. Вам нужно будет вернуть объект ajax deferred или добавить функциональность addClass/removeClass в вашу функцию успеха.

способ добавить свои addClass/функциональность removeClass вашей функции успеха будет выглядеть так:

function FunctionsCall(data, successFn) { 
    $.ajax({ 
     type: 'GET', 
     url: 'includes/helpers/functions.php', 
     dataType: "json", 
     data: data, 
     success: successFn 
    }); 
} 

$('#register-name, #register-surname').keyup(function(e) { 
    var element = $(this); 
    var data = { query: element.val(), funcid: 1 }; 
    var successFn = function(x) { 
     if (x !== 1) { 
      element.addClass('input-has-error') 
     } else { 
      element.removeClass('input-has-error'); 
     } 
    } 
    FunctionsCall(data, successFn); 
}); 
+0

То, что я думаю, есть способ выполнить ajax прежде, чем продолжить – Combinu

+0

@MysticJay Вы можете сделать [синхронный ajax] (https://stackoverflow.com/questions/133310/how-can-i-get-jquery-to-perform-a-synchronous-rather-than-asynchronous-ajax-re), но он остановит работу всей вашей страницы, пока произойдет ajax. Вам лучше позволить ему произойти асинхронно и иметь дело с результатом, когда он входит. – Ian

+0

Итак, вывод заключается в том, что я не могу сделать функцию для ajax и использовать ее везде, где хочу, я должен позвонить туда, где мне это нужно – Combinu

0

Ajax-вызовы асинхронны.

Это означает, что при вызове $.ajax() функция продолжает работать и возвращает x, что не определено, так как ответ ajax еще не отправлен.

function FunctionsCall(data){ 
    var ret; 
    $.ajax({ 
     type:'GET', 
     async: false, 
     url: 'includes/helpers/functions.php', 
     dataType:"json", 
     data: data, 
     success: function(result){ 
      ret = result; 
     } 
    }); 
    return ret; 
} 
+0

Я попытался async false, но все равно я получаю undefined – Combinu

+0

@MysticJay Вы уверены, что вы действительно хотите добиться успеха? Попробуйте добавить функцию 'error'. – Delgan

+0

Это он я зарегистрировал его на консоли – Combinu

0

проверить, выполняется ли следующее, может быть, ваш метод GET требует времени для выполнения.

var x; 
    function FunctionsCall(data){ 
    var ret; 
    $.ajax({ 
    type:'GET', 
    url: 'includes/helpers/functions.php', 
    dataType:"json", 
    data: data, 
    success: function(result){ 
    ret = result; 
    x= result; 
     alert(x) 
    }}); 
    return ret;} 

если фрагмент кода работает, вы должны сделать вас синхронную асинхр: ложной или сделать функцию обратного вызова

0

может быть, потому, что функция Ajax вызывается асинхронно поэтому линия вар х = .... Безразлично» t ждать появления, и поэтому не определено. для этого вы должны использовать обещание здесь пример http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/ http://www.htmlgoodies.com/beyond/javascript/making-promises-with-jquery-deferred.html

0

Ниже следует работать для вас

function FunctionsCall(data){ 
    var ret; 
    $.ajax({ 
    type:'GET', 
    url: 'includes/helpers/functions.php', 
    dataType:"json", 
    data: data, 
    success: function(result){ 
    (result !==1) ? $(this).addClass('input-has-error') : $(this).removeClass('input-has-error'); }); 
    }}); 
} 
1

Проблема заключается в том, что вызов Ajax занимает много времени для выполнения, в то время как ваша обработка x сразу после звонка на FunctionsCall

Предположим, что для перехода к файлу php и получения результата браузер должен отправить запрос по проводу, серверу необходимо обработать запрос и вернуть значение снова провод. Этот процесс требует непредсказуемого количества времени, поскольку он зависит от сетевых подключений и характеристик сервера/текущей нагрузки.

Код для вызова функции и обработки результата происходит сразу после этого шага и, как таковой, не будет иметь требуемых значений при его запуске (браузеры намного быстрее выполняют следующий шаг, чем сети при обработке запросов) ,

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

// function defined, won't be called until you say so 
var processMe = function(result) { 
    alert(result); 
} 

$.ajax({ 
    // ajax params 
    success: function(result) { 
     // function called within success - when we know the request is fully 
     // processed, however long it takes 
     processMe(result)); 
    } 
}); 

Вы также могли бы сделать обработку непосредственно в success блоке, но преимущество использования функции является ее там повторно использовать в будущем, плюс, вы также можете дать ему приятно и понятно имя, как outputValidatedMessage.

1

вы должны отправить запрос АЯКС Синхронный

function FunctionsCall(data){ 
var ret; 
$.ajax({ 
    type:'GET', 
    async: false, 
    url: 'includes/helpers/functions.php', 
    dataType:"json", 
    data: data, 
    success: function(result){ 
     ret = result; 
    } 
}); 
return ret; 

}

0

попробуйте этот код.

function FunctionsCall(data,callback) { 
    try { 
     ajax({ 
      type: 'GET', 
      url: 'includes/helpers/functions.php', 
      dataType: "json", 
      data: data, 
      success: function (result) { 
       callback(result); 
      } 
     }); 
    } catch(e) { 
     alert(e.description); 
    } 
} 
$('#register-name, #register-surname').keyup(function (e) { 
    var data = {    
     uery: $(this).val(), 
     funcid: 1 
    }; 
    FunctionsCall(JSON.stringify(data), function (result) { 
     (result !== 1) ? $(this).addClass('input-has-error') : $(this).removeClass('input-has-error'); 
    }); 
});