JavaScript FileReader:确保变量填充了多个异步文件读取

时间:2014-04-27 13:26:58

标签: javascript filereader

基本上,我正在读取本地文件以向用户显示数据内容。这些文件有一个元数据文本部分,后跟一个大的二进制部分。元数据包含正确解析二进制部分所需的重要信息。因此,我用来解析文件的模式如下:

  1. 获取文本和二进制偏移量
  2. 解析元数据并保存有关二进制解析的信息
  3. 使用步骤2中的信息解析二进制数据
  4. 我已经设置了多个FileReader来实现这一目标,而且一切似乎都在运行。但是,在开发过程中,我必须小心如何保存中间数据,以便它可用于二进制解析步骤。

    这是我创建的基本代码,删除了长文件解析细节以提高可读性:

    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_objparseData()可用?

    似乎是这种情况,但是parseText()发生得非常快,所以我不确定我是否幸运能及时完成。我想确定我理解这种行为。

    谢谢!

1 个答案:

答案 0 :(得分:2)

为了确保数据在$ scope上可用,我宁愿从' loadend'内部调用parseData。 parseText中的事件处理程序。否则,正如你所说,你可能只是幸运。

最佳。