【发布时间】:2014-07-02 19:38:18
【问题描述】:
我正在使用 $.ajax 调用检索的数据库中有一个字符串化的对象数组。我正在尝试使用回调函数将该数据放入我的 ajax 函数之外的数组中。
function getMap(){
return $.ajax({
url: "getMap.php",
type: "POST",
data: "",
dataType: 'JSON',
success: dataHandler
});
};
function dataHandler(data){
console.log(JSON.parse(data));
return JSON.parse(data);
}
var loadedMap = getMap();
console.log(loadedMap);
dataHandler 函数内部的 console.log 在我的 Javascript 控制台中显示为标准数组(可点击,可以查看所有数据)。最后的 console.log 在控制台中显示为 [object Object]。我可以在“responseJSON”字段中看到该对象内部的实际数据,但我似乎无法将其正确地放入到 loadedMap 数组中。
我在这里缺少什么?
编辑:我觉得我的问题与其他问题的所有答案都不同。我的似乎更多的是范围问题。很多答案都提倡使用 .done 和 .fail 方式来处理 AJAX。
var loadedMap = [];
function getMap(){
return $.ajax({
url: "getMap.php",
type: "POST",
dataType: 'JSON',
});
};
getMap().done(function(r) {
if (r) {
loadedMap = r;
} else {
console.log("No data");
}
}).fail(function(x) {
console.log("error");
});
console.log(loadedMap);
此代码成功获取了“loadedMap = r”所在的数组,但是当您在外部对加载的Map 进行console.log 时,它是未定义的。我们如何才能让实际数据在 AJAX 函数之外?
【问题讨论】:
-
你能展示一下 responseJSON 的样子吗?
-
LoadedMap 不是数组,它是您正在制作的 ajax。您需要在 dataHandler 函数内部工作以获取 json 数据或从那里调用另一个函数
-
VLAS: "[[{"type":"land"},{"type":"grass"},{"type":"mountains"},{"type":"water "},{"type":"water"}],[{"type":"land"},{"type":"land"},{"type":"grass"},{"type": "land"},{"type":"mountains"}]]" 对象数组
-
通过指定
dataType: 'json'(注意:应该是小写),jQuery 将已经尝试解析响应(并且,当解析失败时,error)。data可能已经是 JavaScriptArray并且使用JSON.parse(data)可能是多余的。另外,How to return the response from an Ajax call? -
@bo_knows 问题不在于范围,而在于执行时间。
$.ajax()是异步的,这意味着“不是同时”并且代码将在单独的部分中执行 -- 1)getMap()和console.log(loadedMap),然后 2)function(r)和loadedMap = r;,导致loadedMap在被记录后被分配预期的值。
标签: javascript ajax arrays