无法从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:
-
(糟糕的select):设置你的ajax调用是同步的。
-
(正确选项):重构代码,以便在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中可用。