Подтвердить что ты не робот

JQuery возвращает результат ajax во внешнюю переменную

У меня есть проблема с использованием ajax.

Как я могу назначить весь результат из ajax во внешнюю переменную?

Я google это и нашел этот код.

var return_first = (function () {
    var tmp = null;
    $.ajax({
        'async': false,
        'type': "POST",
        'global': false,
        'dataType': 'html',
        'url': "ajax.php?first",
        'data': { 'request': "", 'target': arrange_url, 'method': method_target },
        'success': function (data) {
            tmp = data;
        }
    });
    return tmp;
});

но не работает для меня..

Кто-нибудь может сказать, что не так в этом коде?

4b9b3361

Ответ 1

Вам не хватает запятой после

'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' }

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

var return_first = function () {
    var tmp = null;
    $.ajax({
        'async': false,
        'type': "POST",
        'global': false,
        'dataType': 'html',
        'url': "ajax.php?first",
        'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' },
        'success': function (data) {
            tmp = data;
        }
    });
    return tmp;
}();

Примечание () в конце.

Ответ 2

Это все, что вам нужно сделать:

var myVariable;

$.ajax({
    'async': false,
    'type': "POST",
    'global': false,
    'dataType': 'html',
    'url': "ajax.php?first",
    'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' },
    'success': function (data) {
        myVariable = data;
    }
});

ПРИМЕЧАНИЕ. Использование "асинхронного" не рекомендуется. Смотрите https://xhr.spec.whatwg.org/.

Ответ 3

Использование async: false для предотвращения асинхронного кода - плохая практика,

Синхронный XMLHttpRequest в основном потоке устарел из-за его пагубных последствий для конечного пользователя. https://xhr.spec.whatwg.org/

На поверхности установка async в false устраняет множество проблем, потому что, как показывают другие ответы, ваши данные помещаются в переменную. Однако, ожидая возвращения данных поста (что в некоторых случаях может занять несколько секунд из-за вызовов базы данных, медленных подключений и т.д.), Остальные функции Javascript (такие как инициируемые события, обработанные кнопки Javascript, переходы JQuery (например, аккордеон, или автозаполнение (JQuery UI)) не сможет произойти, пока ответ находится в ожидании (что очень плохо, если ответ никогда не возвращается, так как ваш сайт теперь по сути заморожен).

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

var return_first;
function callback(response) {
  return_first = response;
  //use return_first variable here
}

$.ajax({
  'type': "POST",
  'global': false,
  'dataType': 'html',
  'url': "ajax.php?first",
  'data': { 'request': "", 'target': arrange_url, 'method': method_target },
  'success': function(data){
       callback(data);
  },
});

Ответ 4

'async': false говорит, что это устарело. Я заметил, запускаю ли я console.log('test1'); в случае успеха ajax, затем console.log('test2'); в обычном js после функции ajax test2 печатает перед test1 поэтому проблема в том, что вызов ajax имеет небольшую задержку, но не останавливает остальную часть функции для получения результатов. Переменная просто не была установлена "пока", поэтому вам нужно отложить следующую функцию.

function runPHP(){
    var input = document.getElementById("input1");
    var result = 'failed to run php';

    $.ajax({ url: '/test.php',
        type: 'POST',
        data: {action: 'test'},
        success: function(data) {
            result = data;
        }
    });

    setTimeout(function(){
        console.log(result);
    }, 1000);
}

на test.php (если вам нужно протестировать эту функцию)

function test(){
    print 'ran php';
}

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = htmlentities($_POST['action']);
    switch($action) {
        case 'test' : test();break;
    }
}