Javascript - 为什么这是未定义的?

Javascript - why is this undefined?

开始时提示显示"undefined",为什么?

警报按以下顺序出现:

"success!"
"Data"(应该是什么)
"undefined"

我通过多个线程读取,问题始终是 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;
}

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

你的 getData 函数没有 return 任何东西。

数据未定义,因为函数 getData 没有 return 任何东西。你应该看看 promises。

您需要从函数本身 return 它。

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

}

^ 这 return 是 getData 内的数据。但是 getData 没有对它做任何事情:比如 returning 它。

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

这 return 将数据 getData 发送到任何调用该函数的地方。

编辑:另外,不要使用 async:falseYour browser won't capture any events happening until that AJAX completes. 异步 JS 的好处是……我们可以!在这种情况下应该。

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

getData 没有 return 任何东西。您正在从成功回调中执行 return,但 return 是来自 success 回调的内容,而不是 getData

要将其更改为 getData return,您可以这样做:

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 return 之类的):

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