2014-04-27 45 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。否则,如你所说,你可能只是幸运。

最好。