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;
});
но не работает для меня..
Кто-нибудь может сказать, что не так в этом коде?
Ответы
Ответ 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;
}
}