2014-02-12 52 views
0

最後,我的第一個問題在這裏stackoverflow。我可以向你保證,我已經搜索了相關答案,但沒有人適合我的問題。我現在正在學習JavaScript,擁有.NET和C++的背景,但我無法得到這段代碼去做我期望的。我在這裏複製了許多版本中的一個,可能會有一個可疑的return語句放置,但是也許你可以幫我解決這個問題。JavaScript FileReader()和一個可能的返回或關閉問題

function readFile(file) {              
    var reader = new FileReader(); 
    reader.onload = readSuccess;            
    function readSuccess(evt) {       
     var text = evt.target.result; 
     return text;          
    }; 
    reader.readAsText(file);         
} 

我在這裏嘗試的是正在讀取一個文件,該文件通過類型爲「file」的標記輸入在HTML中接受。 一切都進入代碼內部,直到該部分。我沒有使用Chrome控制檯和Firebug的,捕捉函數的返回到一個變量在控制檯,如:

var x = readFile(aFile); 

而我得到的是一個「未定義」的消息。 使用斷點,我可以看到return語句中的文本內容,並且它正確填充!但文字不退還! 我看過相關的問題,但他們使用innerHTML和其他類型的技巧,我不想在這裏做的,因爲這個函數的結果應該由另一個JS函數使用,而不是更新DOM的任何部分。

非常感謝您的時間。

+0

這是您的*回調函數*中的'return'語句,而不是'readFile'中的返回語句。你不能 - 它是異步的! – Bergi

回答

1

你得到undefined,因爲這就是readFile(aFile)返回(即沒有)。就像事件監聽器一樣,事件數據有多種獲取方式,其中之一就是回調。這裏是你的代碼修改爲使用一個:

function readFile(file, cb) { 
    var reader = new FileReader(); 
    reader.onload = readSuccess; 
    function readSuccess(evt) { 
     cb(evt.target.result) 
    }; 
    reader.readAsText(file); 
} 

var x; 

readFile(aFile, function (data) { 
    x = data; 
}); 

我添加功能readFile的第二個參數,在讀取與傳遞給它的數據文件,該文件會被調用。所有變量賦值都要在回調中完成。

至於其他實現類似結果的方法,還有promisesgenerators,但您可能應該首先了解JS異步基礎知識。

+0

非常感謝。有用。現在我決心尋找資源來理解這種編程。再次感謝。 –