获取未定义的回调

时间:2016-04-12 09:06:01

标签: javascript csv asynchronous xmlhttprequest

当我控制日志时,我有这样的代码,fileContent给出了正确的输出,但当我尝试将它作为返回时,它会给出错误。

我想在其他函数中使用csv文件的内容。保持代码清洁。

    ;(function(){

    function readTextFile(file)
    {
var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, true);
var fileContent;
rawFile.onreadystatechange = function ()
{
    if(rawFile.readyState === 4)
    {
        if(rawFile.status === 200 || rawFile.status == 0)
        {
            var allText = rawFile.responseText;
           fileContent =csvJSON(allText);
           return fileContent;
        }
    }
}
rawFile.send(null);
    }


    function csvJSON(csv){
    var lines=csv.split("\n");

    var result = [];

    var headers=lines[0].split(",");

    for(var i=1;i<lines.length;i++){

    var obj = {};
var currentline=lines[i].split(",");

for(var j=0;j<headers.length;j++){
  obj[headers[j]] = currentline[j];
}

result.push(obj);

    }

    return result; //JavaScript object
    //return JSON.stringify(result); //JSON
    }

    var mainContent = readTextFile("main.csv");


    })();

1 个答案:

答案 0 :(得分:0)

你应该对异步工作有所了解。当您将处理程序设置为readystatechange时,您只需从XMLHttpRequest订阅该事件,此事件触发时将调用您的函数。因此,此功能无法将某些内容返回给您。除非您指定了另一个名为callback的函数,并在处理程序中调用它之后。

看看这个:

function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", file, true);
    var fileContent;
    rawFile.onreadystatechange = function () {
        if(rawFile.readyState === 4) {
            if(rawFile.status === 200 || rawFile.status == 0) {
                var allText = rawFile.responseText;
               fileContent =csvJSON(allText);
               callback(fileContent);
            }
        }
    }

当你想要请求时:

readTextFile('main.csv', function(data) {
    console.log(data);
}

这是异步计算的工作原理。