Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AJAX对对象的响应_Javascript_Ajax_Arrays - Fatal编程技术网

Javascript AJAX对对象的响应

Javascript AJAX对对象的响应,javascript,ajax,arrays,Javascript,Ajax,Arrays,我在数据库中有一个字符串化的对象数组,我正在使用$.ajax调用检索它。我试图使用回调函数将数据放入ajax函数之外的数组中 function getMap(){ return $.ajax({ url: "getMap.php", type: "POST", data: "", dataType: 'JSON', success: dataHandler }); }; function dataHandler(data){ con

我在数据库中有一个字符串化的对象数组,我正在使用$.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]。我可以在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的数组,但当您在外部对loadedMap进行console.log时,其未定义。我们如何才能使实际数据位于AJAX函数之外?

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

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

JQuery的AJAX会返回一个承诺,因此您可以按照您之前尝试的方式进行回调,也可以通过承诺来简化它:

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);
});

你能展示一下responseJSON的样子吗?LoadedMap不是一个数组,而是你正在制作的ajax。您需要在dataHandler函数内部工作,以获得json数据或从以下位置调用另一个函数:[[{type:land},{type:grass},{type:mountains},{type:water},{type:water}],{type:land},{type:land},{type:grass},{type:land},{type:mountains}]]一个对象数组,通过指定数据类型:“json”注意:应该是小写,jQuery将已经尝试解析响应,并且在解析失败时出错。数据可能已经是一个JavaScript数组,使用JSON.parsedata可能是多余的。另外,@bo_知道问题不在于范围,而在于执行的时间。ajax是异步的,这意味着不同时执行,代码将在单独的部分执行-1 getMap和console.logloadedMap,然后2 functor和loadedMap=r;,导致loadedMap在被记录后被分配了预期的值。如果它是字符串,这可能会起作用,但在尝试此操作时,我会遇到未定义的错误。这是有效的,但是loadedMap的作用域现在在thenfunctiondata调用内。在它之后执行console.log会产生一个未定义的错误,这是AJAX的本质,它是事件驱动的。在后台,JQuery后面是一个XmlHttpRequest,它有一个onload事件调用。不管你怎么做,你最终都会得到一个封闭范围内的响应。有什么方法可以解决这个问题吗?我觉得我的问题不是一个AJAX问题,而是一个范围问题。您或多或少需要重新思考如何调用和使用数据。Javascript是事件驱动语言的核心,因此在解决问题时,您必须开始考虑这一点。