6

我有一个 jquery ajax 代码如下:

$(document).ready(function() {
  var global_arr = new Array();
  $.ajax({
    url: 'result.php',
    type: 'post',
    dataType: 'json',
    success: function(data) {
       $.each(data, function(key, value) {
          global_arr.push(value.name);
       });
       alert(global_arr); //get correct value, works fine
     }
  }); //end of ajax function
  alert(global_arr); //get null, it doesn't work properly
});

请注意警告 global_arr 的行,为什么我无法从 $.ajax() 函数中获取值?感谢任何人对此的帮助。

4

4 回答 4

6

Ajax 需要时间来完成。函数执行几乎不需要那么多时间。因此,当您在 ajax 请求之外收到警报时,ajax 请求仍在使用时间来完成(无论是在传输中还是在服务器端操作中)。

您可以随时等待 ajax 方法完成。

$(document).ready(function() {

 var global_arr = new Array();
 var complete = false;//flag to wait for ajax completion
 $.ajax({
  url: 'result.php',
  type: 'post',
  dataType: 'json',
  success: function(data) {
   $.each(data, function(key, value) {
      global_arr.push(value.name);
   });
   alert(global_arr); //get correct value, works fine
   complete = true;//mark ajax as complete
  }
 }); //end of ajax function

 (function runOnComplete(){
  if( complete ){//run when ajax completes and flag is true
   alert(global_arr);
  }else{
   setTimeout(runOnComplete,25);//when ajax is not complete then loop
  }
 })()
});

但是,最常见的方法是使用回调。

$(document).ready(function() {

 function runOnComplete(){//code executes once ajax request is successful
  alert(global_arr);
 }
 var global_arr = new Array();
 $.ajax({
  url: 'result.php',
  type: 'post',
  dataType: 'json',
  success: function(data) {
   $.each(data, function(key, value) {
    global_arr.push(value.name);
   });
   alert(global_arr); //get correct value, works fine
   runOnComplete();//callback
  }
 }); //end of ajax function
});
于 2013-04-03T19:15:43.100 回答
5

Ajax 是异步的。在 JS 引擎到达您的非功能 alert() 行时,AJAX 调用还没有机会从服务器获得响应并设置变量。

这就是内部 alert() 起作用的原因。当响应来自服务器时,它会被执行。

于 2013-04-03T19:06:39.390 回答
0

那是因为alert(global_arr); //get null, it doesn't work properly之前的运行$.ajax已经完成

于 2013-04-03T19:11:12.340 回答
0

我的建议是将其分解为 3 个功能,这样会更有意义。您将需要 ajax、handelRequest、onComplete。您可能还想为您的 ajax 函数添加错误处理程序,因此如果它确实失败了,它可以在不锁定用户的脚本的情况下这样做。

$(document).ready(function () {

    var global_arr = new Array();

    $.ajax({
        url: 'result.php',
        type: 'post',
        dataType: 'json',
        success: handelRequest(data),
        error: handleError             
    });

    function handelRequest(data) {          
        $.each(data, function (key, value) {
            global_arr.push(value.name);
        });
        onComplete(global_arr); //get correct value, works fine
    }

    function onComplete(global_arr){
        // then here you can do what ever you
        // you would like with the array
        alert(global_arr);
    }

    function handleError(){
        // gracefully fail
    }

})
于 2013-04-03T19:51:16.127 回答