2010-05-16 3 views
5

Я пытаюсь использовать возврат из jQuery ajax-вызова в свою собственную функцию, но он продолжает возвращаться не определен.return from jquery ajax call

function checkUser2(asdf) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "check_user.php", 
     data: { name: asdf }, 
     success: function(data){ 
      return data; 
      //alert(data); 
     } 
    }); 
} 

$("#check").click(function(){ 
    alert(checkUser2("muma")); 
}); 

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

ответ

7

AJAX-вызов является асинхронным - это означает, что запрос AJAX выполнен не в порядке выполнения обычной программы, а в вашей программе означает, что checkUser2() не возвращает данные для предупреждения.

Вы не можете использовать возвращаемые значения из $.ajax() вызовов таким образом, вместо этого переместите код, который использует возвращаемые данные AJAX, в функцию success() - для чего предназначен.

1

Попробуйте вместо этого:

function checkUser2(asdf) { 
    var result; 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "check_user.php", 
     data: { name: asdf }, 
     success: function(data){ 
      result = data;    
     } 
    }); 
    return result; 
}  


$("#check").click(function(){ 
    alert(checkUser2("muma")); 
}); 

Вы, возможно, придется переместить переменную результата, как глобальная переменная JavaScript вместо этого. Я еще не тестировал это.

+1

Синхронный аякс - это действительно плохая идея. – Pointy

+0

Согласен, но это была проблема вокруг проблемы. И он уже использовал функцию ajax асинхронным способом. – Falle1234

+0

Этот способ для меня тоже не сработал. $ ("# submitPO"). click (function() { alert (updatePO ("444")); }); не удалось вызвать предупреждение. Моя функция структурирована так же, как ваша. –

3

Вы можете сделать это, я думаю:

function checkUser2(asdf) { 
    var s = $.ajax({ 
     type: "POST", 
     async: false, 
     url: "check_user.php", 
     data: { name: asdf }, 
     success: function(data){ 
      return data; 
      //alert(data); 
     } 
    }).responseText; 
    return s; 
}  

, но, как и в 4-ом примере jquery doc page for ajax function говорит, я думаю, что

блоков браузера в то время как запросы активен. Лучше блокировать взаимодействие с пользователем> другими способами, когда необходима синхронизация.

+0

Это устраняет проблему, которая была у меня почти в том же сценарии, поскольку «async: false» была ключевой частью, чтобы остановить вызов, сделанный несинхронно. –

0

Вы также можете сохранить «данные» с помощью метода данных jQuery и связать его с глобальным объектом jQuery или локальным селектором jQuery. Напр.

success: function(data) { 
    $.data('result', data); 
} 

Возвращаемое значение может быть доступна в любом месте с помощью

$.data('result') 

Вы также можете связать это с локальной переменной (для, например, $ («# MyId»). Данные()), так что его локально для этого объекта, а не в глобальном масштабе.

+0

Я попытался использовать ваше предложение. Я не мог заставить его работать. $ ("# submitPO"). click (function() { alert ($. data ('result')); }); Ничего не сделал. –