Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jqueryajax调用成功,如何在包装器javascript函数中更改全局变量?_Javascript_Jquery - Fatal编程技术网

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;  
?>