在JavaScript回调函数中设置局部变量
我对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
显示为未定义。 任何人都可以向我解释为什么没有设置它以及如何在回调函数中设置局部变量。
这里的问题是,当ajax调用异步执行时, console.log
同步执行。 因此它在回调完成之前运行,因此它仍然将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(); }}); });
ajax中的第一个A用于异步,这意味着在调试数组时,结果仍未传递。 数组在显示它的值时未定义。 您需要在array = data下面执行console.debug。
success
函数不会立即执行,而是仅在HTTP响应到达后才执行。 因此,此时array
仍未undefined
。 如果要对HTTP响应数据执行操作,请在success
函数内执行操作,或者在函数内部定义该操作,然后在success
回调中调用该函数。
尝试调用函数在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"); } });
AJAX是异步的。 您正在设置array
变量,但在该debug
执行之后才会设置。 进行AJAX调用会发送请求,但随后会继续执行代码。 稍后,请求将返回,您的success
或error
函数将执行。