【问题标题】:AJAX response into an object [duplicate]AJAX响应到对象[重复]
【发布时间】: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 可能已经是 JavaScript Array 并且使用 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


【解决方案1】:

getMap 函数不返回响应,它只是在响应到达时调用 dataHandler。 创建一个全局变量并将 JSON.parse(data) 的值分配给该变量。 :

    var myData;
    function getMap(){
...
    });
    };
    function dataHandler(data){
        console.log(JSON.parse(data));
        myData = JSON.parse(data);
    }
getMap();

【讨论】:

  • 如果它是一个字符串,这可能会起作用,但是当我尝试这个时,我会遇到未定义的错误。
【解决方案2】:

JQuery 的 AJAX 返回一个 Promise,因此您可以按照您正在尝试的方式执行回调路由,或者您可以使用 Promise 简化它:

function getMap(){
    return $.ajax({
    url: "getMap.php",
    type: "POST",
    data: "",
    dataType: 'JSON',
    success: dataHandler
    });
};

getMap().then(function(data){
    loadedMap = JSON.parse(data);
    console.log(loadedMap);
});

【讨论】:

  • 这行得通,但是 loadedMap 的范围现在在 then(function(data)) 调用中。在它之后执行 console.log,会产生一个未定义的错误。
  • 这就是 AJAX 的本质,它是事件驱动的。在后台,在 JQuery 后面,是一个 XmlHttpRequest,它有一个 onload 事件调用。不管你怎么做,你最终都会得到一个封闭范围内的响应。
  • 有什么办法解决这个问题吗?我觉得我的问题与其说是 AJAX 问题,不如说是范围问题。
  • 您或多或少需要重新考虑如何调用和使用数据。 Javascript 的核心是一种事件驱动语言,因此当您解决问题时,您必须开始考虑这一点。
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 2014-10-27
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2012-07-17
相关资源
最近更新 更多