2012-12-03 22 views
2

我一直在使用FileReader API來讀取本地文件並將它們提供給Java小程序,並且此功能目前已工作。該文件被讀取,該applet的行爲就像它應該的。將文件內容(作爲字符串)傳遞給applet的函數當前稱爲INSIDE函數,分配給Reader的onloadend()事件(爲了某些錯誤處理需要,我使用onloadend()而不是onload()。也許我可以用try/catch指令替換它,我會研究它)。現在我想將文件的內容傳遞給一個全局變量,以便用Javascript解析它。問題是,這似乎是不可能的,因爲:FileReader API:查看回調之外的內容

1)FileReader對象的.result成員在文件加載後是空的(這是有道理的,看看讀者本身是如何異步的); 2)如果我將.result成員複製到一個全局變量中,例如,如果我這樣做:

var my_string; 

function load_callback() 
{ 
    //Do some stuff... 
    my_string = this.result; 
} 

... 

my_reader = new FileReader(); 
my_reader.onloadend = load_callback; 
my_reader.readAsText(my_file) 
document.getElementById("empty_paragraph").innerHTML = my_string; 

我得到一個大的漂亮undefined結果(而這並沒有太大的意義,真的)。 我該怎麼辦?這是否有其他安全功能,使FileReader無法傳播其回調方法外的文件內容?在任何人提到它之前 - 是的,該文件已被用戶正確提交(正如我所說的,該頁面的其餘部分工作);是的,我已經檢查過名稱my_string沒有任何重複;我已經在Chromium和Firefox上測試過了,所以它不依賴於瀏覽器。有人能幫我嗎?

回答

1

同步文件讀取器僅在WebWorker上下文中可用,因爲阻止輔助線程不會導致UI凍結。反正有沒有辦法查看回調外的內容,除非你使用:

<script type="application/javascript;version=1.7"></script> 

哪隻適用於Firefox。它允許您使用yield關鍵字,該關鍵字可用於實現可用於以同步方式編寫異步代碼的fibers

+0

然而,正如我所說,問題只是一個時間......一旦文件被讀取,我可以自由地訪問其內容(當然通過全局變量)。 – Okarin

+0

@Okarin是的,因爲訪問變量是同步的。 FileReader是異步的,所以最初的讀取*不可能*沒有回調。這不是一項安全功能,而是一項功能,可讓您在同一個線程中執行I/O而不會阻塞。 – Esailija

+0

是的,我非常理解。你上面的答案被刪除了,但其實質是這個東西有效 - 我只需要給它足夠的時間讓文件被實際讀取。我會嘗試找到一個更好的解決方法(只是等待將是一個可怕的解決方案,並依賴機器),但至少我知道 - 原則上 - 這不是不可能的。 – Okarin