jqueryajax调用成功,如何在包装器javascript函数中更改全局变量?
如何将全局变量jqueryajax调用成功,如何在包装器javascript函数中更改全局变量?,javascript,jquery,Javascript,Jquery,如何将全局变量url设置为返回的成功ajax数据?在Javascript中,函数不可能返回异步结果。该函数通常会在AJAX请求发出之前返回 您始终可以强制请求与异步:false同步,但这通常不是一个好主意,因为这会导致浏览器在等待结果时锁定 解决这个问题的标准方法是使用回调函数 function ajax_test(str1){ var url = "None" jq.ajax({ type:'post', cache: false,
url
设置为返回的成功ajax数据?在Javascript中,函数不可能返回异步结果。该函数通常会在AJAX请求发出之前返回
您始终可以强制请求与异步:false
同步,但这通常不是一个好主意,因为这会导致浏览器在等待结果时锁定
解决这个问题的标准方法是使用回调函数
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
}
然后你可以这样称呼它:
function ajax_test(str1, callback){
jq.ajax({
//... your options
success: function(data, status, xhr){
callback(data);
}
});
}
下面是我的示例代码,用于从php检索数据,然后将值传递给ajax成功函数中的javascript全局变量。这对我有用
ajax_test("str", function(url) {
//do something with url
});
PHP代码(readString.PHP):
但是,由于$.ajax()异步发送请求,这意味着它可能会在成功回调运行之前返回,因此您不应该依赖于它按顺序运行并自行返回值。因此,这里我们将php响应值分配给回调函数中的全局值 只有在抛出成功后,您才需要对url
执行某些操作?它不是全局的,因为它前面有关键字var。我认为您指的是外部范围。如果它与您的返回值相关,那么ajax是异步的,因此它将在ajax完成之前返回值。除非您使用的同步请求恰好被弃用,并且可能导致意外行为。顺便说一句,您使用的是什么版本的jQuery?可能有另一种解决方案。@FrançoisWahl没问题,即使是速记表单选择器(例如:checkbox
)和.load()
方法也被标记为不推荐使用,我过去经常使用,我评论说异步:false
通常不是锁定浏览器的好方法,忘了你的反对吧<代码>:P
@fabriciomatté:+1,完全同意良好做法。我发现1.8版本的改动让我自己有点困惑:)这可能不是OP特别要求的,但这是正确的做法+你的前两段有些矛盾。不可能返回异步结果[除非使用async:false
,除非如第二段中所述严格必要,否则应避免使用该方法]。虽然解释得很好。@Fabricio MattéNo,这不是矛盾,因为如果使用async:false
,那么它就不再是异步的了。Fault在他的回答中也做了类似的解释,但这是一个很好的观点。我正试图这样做,但我被告知回调函数的名称不存在。我试图找到的每一个解决方案都把我送到这里
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
$fn = $_POST['fn'];
$file = fopen("path/".$fn.".record","r");
$string = fread($file,filesize("path/".$fn.".record"));
fclose($file);
echo $string;
?>