在JavaScript回调函数中设置局部变量

时间:2012-02-20 21:22:20

标签: javascript jquery ajax callback

我对JavaScript比较陌生,我认为我知道回调函数是如何工作的,但经过几个小时的网络搜索,我仍然不明白为什么我的代码无效。

我正在发出一个返回字符串数组的AJAX请求。我正在尝试将此数组设置为局部变量,但是一旦执行回调函数,它似乎就会丢失它的值。

    var array;

    $.ajax({
        type: 'GET',
        url: 'include/load_array.php',
        dataType: 'json',
        success: function(data){
            array = data;
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert("Error loading the data");
        }
    });

    console.debug(array);

在控制台中,array显示为未定义。任何人都可以向我解释为什么没有设置它以及如何在回调函数中设置局部变量。

5 个答案:

答案 0 :(得分:7)

这里的问题是console.log在ajax调用异步执行时同步执行。因此它在回调完成之前运行,因此它仍然将array视为undefined,因为success尚未运行。为了完成这项工作,您需要延迟console.log来电,直到success完成。

$(document).ready(function() {
    var array;

    var runLog = function() {
      console.log(array); 
    };

    $.ajax({
      type: 'GET',
      url: 'include/load_array.php',
      dataType: 'json',
      success: function(data){
        array = data;
        runlog();
    }});
});

答案 1 :(得分:2)

ajax中的第一个A用于异步,这意味着在调试数组时,结果仍未传递。数组在显示它的值时未定义。您需要在array = data。

下面执行console.debug

答案 2 :(得分:1)

success函数不会立即执行,而是仅在HTTP响应到达后执行。因此,此时array仍为undefined。如果要对HTTP响应数据执行操作,请在success函数内执行操作,或者在函数内部定义该操作,然后在success回调中调用该函数。

答案 3 :(得分:1)

尝试调用函数以在success

之后设置此变量
var array;

var goodToProceed = function(myArr) {
   console.debug(myArr);
};

$.ajax({
type: 'GET',
url: 'include/load_array.php',
dataType: 'json',
success: function(data){
    goodToProceed(data);
},
error: function(jqXHR, textStatus, errorThrown){
    alert("Error loading the data");
}
});

答案 4 :(得分:0)

AJAX是异步的。您正在设置array变量,但在debug执行之后才会设置。进行AJAX调用会发送请求,但随后会继续执行代码。稍后,请求将返回,您的successerror函数将执行。