2014-04-27 44 views
0

基本上,我正在讀取本地文件以向用戶顯示數據內容。這些文件有一個元數據文本部分,後面是一個大的二進制部分。元數據包含正確解析二進制部分所需的重要信息。所以,我使用來解析該文件的模式如下:JavaScript FileReader:確保變量填充多個異步文件讀取

  1. 獲取文本和二進制偏移
  2. 解析元數據並保存信息關於二進制解析
  3. 使用從信息分析二進制數據第2步

我已經設置了多個文件讀取器來完成此操作,並且一切似乎都正常。但是,在開發過程中,我必須小心中間數據的保存方式,以便它可用於二進制解析步驟。

這裏是我創建的基本代碼,使用長文件解析細節更好的可讀性刪除:

function setupReader(obj) { 
    var reader = new FileReader(); 
    reader.addEventListener("loadend", function(evt) { 
     ...get start/end locations for text and data sections 

     parseText(obj); 
     parseData(obj); 
    }); 
    var blob = obj.file.slice(0, 58); 
    reader.readAsBinaryString(blob); 
} 

function parseText(obj) { 
    var reader = new FileReader(); 
    reader.addEventListener("loadend", function(evt) { 
     ...do lots of stuff and record new properties in obj 

     // save obj to scope so it's available to parse data section 
     $scope.file_obj = obj; 
    }); 

    var blob = obj.file.slice(obj.text_begin, obj.text_end); 
    reader.readAsBinaryString(blob); 
} 

function parseData(obj) { 
    var reader = new FileReader(); 
    reader.addEventListener("loadend", function(evt) { 
     ...populate array in $scope.file_obj from binary data 
    }); 

    var blob = obj.file.slice(obj.data_begin, obj.data_end); 
    reader.readAsBinaryString(blob); 
} 

我的問題是這樣的模式是否保證$scope.file_obj將在parseData()可用?

這似乎是這樣,但parseText()發生得非常快,所以我不確定我是否幸運地完成了它的時間。我想確定我瞭解這種行爲。

謝謝!

回答

2

爲了確保數據在$ scope中可用,我寧願從parseText中的'loadend'事件處理函數中調用parseData。否則,如你所說,你可能只是幸運。

最好。