Javascript - 为什么这个未定义?

时间:2017-12-08 17:54:42

标签: javascript jquery ajax synchronous

开头的警报显示“未定义”,为什么?

警报按此顺序排列:

“成功了!”
“数据”(应该是什么)
“未定义”

我通过多个线程阅读,问题始终是ajax是异步的,因此在访问数据时没有定义数据,但在我的情况下数据就在那里,我的函数中的警报显示了另一个警报之前的数据它未定义的地方!

非常感谢任何帮助!

我收到了这段代码

var data = getData("");
alert(data);            <<<<<<< UNDEFINED

function getData(fileName) {

    $.ajax({
        async:false,
        type: "GET",
        url: "breastCancer.csv",
        dataType: "text",
        success: function (data) {
            var arrData = processData(data);
            alert("success!");
            alert(arrData);      <<<<< WORKS GREAT
            return arrData;
        },
    });

}

function processData(data) {

    var arrData = CSVToArray(data);

    dimensions = arrData[0];
    var objects = [];

    objects[0] = dimensions;

    for (var i = 1; i < arrData.length; i++){
        objects[i] = new Object();

        for (var j = 0; j < dimensions.length; j++){
            objects[i][dimensions[j]] = arrData[i][j];
        }
    }

    return objects;
}

为了澄清,我知道异步是用户体验的方式,但是这个页面只需要显示来自此调用的数据,所以我可以等待它。

4 个答案:

答案 0 :(得分:4)

您的getData功能无法返回任何内容。

答案 1 :(得分:1)

您需要从函数本身返回它。

getData

^这将返回getData内的数据。但是function getData(fileName) { var ourData = ""; $.ajax({ async:false, type: "GET", url: "breastCancer.csv", dataType: "text", success: function (data) { var arrData = processData(data); ourData = arrData; }, }); return ourData; } 对它没有任何作用:比如返回它。

getData

这会将数据 async:false返回到任何正常运行的调用。

编辑:另外,请勿使用{{1}}。 Your browser won't capture any events happening until that AJAX completes.异步JS的好处是......我们可以!在这种情况下应该。

答案 2 :(得分:1)

前言:不要使用async: false。但回答这个问题:

getData不会返回任何内容。您从成功回调中做了return,但这会从success回调中返回一些内容,而不是getData

要更改它以便getData返回某些内容,您可以执行以下操作:

function getData(fileName) {
    var arrData;
    $.ajax({
        async:false,
        type: "GET",
        url: "breastCancer.csv",
        dataType: "text",
        success: function (data) {
            arrData = processData(data);
        },
    });
    return arrData; // <=== Now `getData` returns something
}

不这样做。相反,采用异步编程并删除async: false。例如,回调:

function getData(fileName) {
    $.ajax({
        async:false,
        type: "GET",
        url: "breastCancer.csv",
        dataType: "text",
        success: function (data) {
            callback(processData(data));
        },
    });
}

......这样叫:

getData(function(data) {
    alert(data);
});

...或承诺($.ajax返回一种):

function getData(fileName) {
    return $.ajax({
        async:false,
        type: "GET",
        url: "breastCancer.csv",
        dataType: "text",
        success: function (data) {
            callback(processData(data));
        },
    }).then(data) {
        return processData(data); // <== Becomes the resolution value of `getData`'s promise
    });
}

然后

getData().then(function(data) {
    alert(data);
});

答案 3 :(得分:0)

数据未定义,因为函数getData不返回任何内容。你应该看看承诺。