2016-04-12 5 views
0

У меня такой код, когда я консольный журнал 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"); 


    })(); 

ответ

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

Это как асинхронный расчет работы.

Смежные вопросы