无法从jQuery Ajax调用获取正确的返回值

这应该返回一个包含图片文件名列表的JSON对象。 评论的警报显示正确的数据,但alert(getPicsInFolder("testfolder")); 显示"error"

 function getPicsInFolder(folder) { return_data = "error"; $.get("getpics.php?folder=" + folder, function (data) { data = jQuery.parseJSON(data); $.each(data, function (index, value) { data[index] = "folders/" + folder + "/" + value; }); //alert(data); // This alert shows the correct data, but that's hardly helpful return_data = data; }); return return_data; } 

我究竟做错了什么?

您正在调用asynchronous$.get()方法,在getPicsInFolder()函数返回后,将调用其callback函数。 请按照以下示例中的注释进行操作:

 function getPicsInFolder(folder) { return_data = "error"; // Since the $.get() method is using the asynchronous XMLHttpRequest, it // will not block execution, and will return immediately after it is called, // without waiting for the server to respond. $.get("getpics.php", function (data) { // The code here will be executed only when the server returns // a response to the "getpics.php" request. This may happen several // milliseconds after $.get() is called. return_data = data; }); // This part will be reached before the server responds to the asynchronous // request above. Therefore the getPicsInFolder() function returns "error". return return_data; } 

您应该考虑以这样的方式重构代码:处理JSON对象的逻辑位于$.get()callback中。 例:

 $.get("getpics.php?folder=test", function (data) { // Handle your JSON data in here, or call a helper function that // can handle it: handleMyJSON(data); // your helper function }); 

你正在asynchronous获取数据。 callback函数function (data) {}getPicsInFolder返回后getPicsInFolder

你有两个select:

  1. (糟糕的select):设置你的ajax调用是同步的。

  2. (正确选项):重构代码,以便在callback中发生任何需要返回数据的事件。

一种方法是将callback传递给getPicsInFolder ,如下所示:

 function getPicsInFolder(folder, callback) { return_data = "error"; $.get("getpics.php?folder=" + folder, function (data) { data = jQuery.parseJSON(data); $.each(data, function (index, value) { data[index] = "folders/" + folder + "/" + value; }); callback(data); //pass data into the callback function }); 

然后,当你调用你的getPicsInFolder,而不是:

 pics = getPicsInFolder('foldername'); //do something with pics 

做这个:

 getPicsInFolder('foldername', function (pics) { //do something with pics }); 

AJAX请求应该是asynchronous的(你可以以停止执行和实际上阻止你的UI为代价执行同步)。

getPicsInFolder()在AJAX请求完成之前返回。 您需要更新UI /处理完整事件(作为parameter passing给$.get()的匿名函数)返回的JSON对象:

 $.get("", function () { // This anonymous function will execute once the request has been completed // Update your UI/handle your data here }); 

说我想更新我的UI中的一个元素…

 $("#ID-of-a-button-in-the-UI").click(function () // executes on click { $.get("url-to-JSON-object", function (json) // executes on request complete { $("#ID-of-element-to-update").html(json.rows[0].key); // updates UI }); }); 

你对AJAX如何工作感到困惑。 数据在请求完成之前不可用,这是在函数返回之后发生的。 数据只在callback中可用。