Jquery ajax call success, как изменить глобальную переменную в функции обертки javascript?
function ajax_test(str1){
var url = "None"
jq.ajax({
type:'post',
cache: false,
url: 'http://....' + str1,
success: function(data, status, xhr){
url=data;
},
error: function (xhr, status, e) {
},
async: true,
dataType: 'json'
});
return url
}
Как установить глобальную переменную url
как возвращаемые данные ajax для успеха?
Ответы
Ответ 1
В Javascript невозможно, чтобы функция return
выполняла асинхронный результат. Функция обычно возвращается до того, как будет выполнен запрос AJAX.
Вы всегда можете заставить свой запрос быть синхронным с async: false
, но это обычно не очень хорошая идея, потому что это заставит браузер запираться, пока он ждет результатов.
Стандартный способ обойти это с помощью функции обратного вызова.
function ajax_test(str1, callback){
jq.ajax({
//... your options
success: function(data, status, xhr){
callback(data);
}
});
}
а затем вы можете вызвать его так:
ajax_test("str", function(url) {
//do something with url
});
Ответ 2
Вот мой примерный код для извлечения данных из php, а затем передайте значение глобальной переменной javascript в функции успеха ajax. Меня устраивает!
var retVal = null;
function ajaxCallBack(retString){
retVal = retString;
}
function readString(filename){
$.ajax({
type: "POST",
url: "readString.php",
data: { 'fn': filename },
success: function(response){
ajaxCallBack(response);
}
});
}
PHP code (readString.php):
<?php
$fn = $_POST['fn'];
$file = fopen("path/".$fn.".record","r");
$string = fread($file,filesize("path/".$fn.".record"));
fclose($file);
echo $string;
?>
Однако, поскольку $.ajax() отправляет запросы асинхронно, что означает, что он может вернуться до запуска обратного вызова успеха, вы не должны полагаться на то, что он выполняется последовательно и возвращает значение самостоятельно. Поэтому здесь мы присваиваем значение ответа php глобальному значению в функции обратного вызова.