JQuery - Как использовать возвращаемое значение вызова ajax за пределами этого вызова ajax [duplicate]

На этот вопрос уже есть ответ здесь:

Как вернуть ответ от асинхронного вызова? 33 ответа

У меня есть вызов Ajax. Я поместил возвращаемое значение (данные) в переменную mydata. Я хотел бы использовать эту переменную вне вызова ajax. Обратите внимание, что я не могу включить свой код в успешную часть вызова ajax. Я не буду подробно описывать причины, так как это добавит путаницы. Так что вопрос прост. Есть ли способ использовать возвращаемое значение вызова ajax за пределами этого вызова ajax? Заранее благодарю за ваши ответы. Приветствия. Марк

$.ajax({
    type: "POST",
    url: "file.php",
    data: ajaxData,
    success: function(data) {
        var mydata = data;    
    }
});

alert(mydata); // -> This is not working
 YumYumYum02 апр. 2012 г., 11:17
var mydata = null; $.ajax({ type: "POST", url: "file.php", data: ajaxData, success: function(data) { mydata = data; } }); alert(mydata);
 m9002 апр. 2012 г., 11:17
Просто объявитьvar mydata в той области, в которой вы нуждаетесь (т.е. вне вызова).

Ответы на вопрос(4)

вы не можете установить значение обратного вызова в глобальную переменную js. Вы должны использовать значения обратного вызова в стеке обратного вызова.

вы имеете в виду, что вы получаете неопределенный объект или объект в оповещении?

В вашем примере данные будут возвращены как объект json. Поэтому вам нужно знать структуру этого объекта, чтобы иметь возможность его использовать.

Например, если структура:

data = {name = "Bob", location = "London"}

тогда data.name даст вам значение Bob.

Также переменная mydata является локальной для функции post jquery, вам нужно определить ее вне функции, чтобы использовать ее вне функции.

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

Этот код работает нормально, он просто асинхронный, а ваши переменные данные заполняются позже. Попробуйте что-то вроде этого, чтобы увидеть ваши данные на консоли:

var process(data) {
    // output your data
    console.log(data);
}

$.ajax({
    type: "POST",
    url: "file.php",
    data: ajaxData,
    success: process
});
Решение Вопроса

Нет, вы не можете, так как A в AJAX означает «Асинхронный», поэтому скрипт не «ожидает» завершения вызова AJAX.

Вы можете, если хотите, использовать интервальный опрос, чтобы увидеть, установлены ли mydata:

var mydata = null;

$.ajax({
    type: "POST",
    url: "file.php",
    data: ajaxData,
    success: function(data) {
        var mydata = data;    
    }
});

var timerId = setInterval(function() {
   if(mydata !== null) {
      // your code
      clearInterval(timerId);
   }
}, 1500); // change this to your liking, doesn't really matter

Но это предполагает, чтоfile.php никогда не возвращает ноль в данных

 meagar♦04 июл. 2013 г., 14:33
Это ужасное решение хорошо решенной проблемы. Используйте обратные вызовы или обещания, делайтене используйте цикл опроса.
 Yorgo02 апр. 2012 г., 11:27
это плохой обходной путь. Если вызов ajax не вернется в случае успеха, он будет бесконечным циклом
 Andreas Wong02 апр. 2012 г., 11:29
Если вызов ajax не возвращается, тогда mydata всегда будет нулевым, а mydata! == null завершится ошибкой и будет немедленно возвращаться из функции каждые 1,5 секунды ...
 Andreas Wong05 июл. 2013 г., 04:37
@ meagar я рассуждаю так: ограничение, наложенное ОП:Do note that I can not incorporate my code in the success part of the ajax call. I will not detail the reasons as it will add confusion. Я полностью понимаю, что это плохой обходной путь, который я обычно не поощряю: s.
 Marc02 апр. 2012 г., 11:23
спасибо спасибо за подтверждение ...

Ваш ответ на вопрос