2014-03-06 73 views
0

請檢查下面的代碼更新的變量:在reader.onload段內返回一個子功能

function loadCSV(fileInput) { 
    var reader = new FileReader(); 
    reader.readAsText(fileInput); 
    var result = {}; 
    var file = {}; 
    var error = {}; 
    reader.onload = function(evt) { 
     var csv = evt.target.result; 
     var data = $.csv.toArrays(csv); 
     file[fileInput.name] = data; 
     result['file'] = file; 
     console.log(result); 
    } 
    reader.onerror = function() { 
     error = { 
      'message': 'Unable to read ' + fileInput.name 
     } 
     result['error'] = error; 
    } 
    console.log(result); 
    return result; 
} 

result是正確的,但返回的result是空的。我知道這是因爲我正在更新result中的子函數reader.onload,我也知道使用loadCSV的回調是解決問題的一種解決方案。但我想知道是否有任何方法可以使loadCSV返回更新的result

謝謝。

+2

尋找promise模式,例如[jQuery Deferred](http://api.jquery.com/category/deferred-object/)。 – Sirko

+2

filereader API是異步的,您的外部函數在執行回調之前返回。您不能從異步函數返回。另請參閱http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call –

+0

@FelixKling - 這是一個很好的線程。 –

回答

1

連接到FileReader.onload的任何事件處理程序都將是異步函數,這意味着它在完成時完成。如果你想對結果做些什麼,你將不得不在處理函數中執行它。