Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.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-为什么这是未定义的?_Javascript_Jquery_Ajax_Synchronous - Fatal编程技术网

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

Javascript-为什么这是未定义的?,javascript,jquery,ajax,synchronous,Javascript,Jquery,Ajax,Synchronous,开始时的警报显示未定义,为什么 警报的顺序如下: 成功! 数据应该是什么 未定义 我通读了多个线程,问题总是ajax是异步的,因此在访问数据时没有定义数据,但在我的例子中,数据在那里,我函数中的警报在未定义的另一个警报之前显示数据 非常感谢您的帮助 我有这个密码 var data = getData(""); alert(data); <<<<<<< UNDEFINED function getData(fileName) {

开始时的警报显示未定义,为什么

警报的顺序如下:

成功! 数据应该是什么 未定义

我通读了多个线程,问题总是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函数不返回任何内容。

由于函数getData不返回任何内容,因此数据未定义。您应该看看承诺。

您需要从函数本身返回它

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

}
这会将数据从getData返回给调用该函数的任何对象

编辑:另外,不要使用async:false。异步JS的好处是…我们可以!在这种情况下,应该。

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

getData不返回任何内容。您正在从成功回调返回,但这会从成功回调返回一些内容,而不是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
}
…这样称呼:

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

不要使用async:false。它不使用吗?函数内部的返回是做什么的?好的,我明白了,我不能将java知识用于JS。您可以从匿名成功函数返回一个值。getData本身不返回任何内容。你的Java知识没有问题,你有两个函数,一个返回,一个不返回。这在技术上是正确的。但是这个答案应该是一个注释。@Marcel关于您的Java知识:lambda中的return语句也不会从它们所包含的函数中返回。我返回了,但老实说,我根本不理解它们。我来自java背景,这应该只是一个小练习,但我发现我不能在JS中真正使用我的java知识…@Marcel我不知道java如何与lambdas的工作方式大致相同,至少在本次讨论中是这样。我明白了,所以返回ajax内部不会跳出封闭函数。谢谢我还不能接受你的回答,因为你太快了!但是效果很好,再次感谢@Marcel当然不是,它从它所在的函数返回。Java的工作方式相同,例如,请参见。函数中定义了一个函数;从lambda返回并不是从封闭函数返回。我发现我误解了ajax,我没有将其视为函数。我不知道你能从阿贾克斯回来,谢谢!这只是返回一个空字符串;这行不通您必须使用回调或承诺。只要完成此ajax调用,页面就不会显示任何内容或占位符数据,这将更加混乱而不是有用。但我明白了异步的意义,我会努力理解承诺,谢谢@Marcel:即便如此,锁定UI还是很糟糕的UX,因此显示一些内容,比如加载而不锁定UI,然后用ajax结果替换UI通常是最好的。我倾向于将加载延迟250毫秒,这样如果调用很快完成,它就不会在用户面前闪烁。不管好坏祝你好运-
getData(function(data) {
    alert(data);
});
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);
});