FileReader输出未定义

时间:2014-08-29 23:35:30

标签: javascript html closures filereader

我有一个函数,它将blob作为输入并吐出二进制字符串(理想情况下应该)

function chunkBinary(chunkFile){
    var reader = new FileReader();
    reader.onloadend = (function(reader)
    {
        return function()
        {
            console.log(reader.result);
            return reader.result
        }
    })(reader);
    reader.readAsBinaryString(chunkFile);
}

我将此函数分配给另一个函数中的变量

function showUploadProgress(){

    for (var i=0; i<chunk.length; i++) {
        if(chunk[i][0] != 'No Error'){
            errorUploadFiles[j] = chunk[i];
            j++;
        } 
            //j starts from 4 as chunk[i][0..3] has some file data and then the blobs start from 4
            for(var j = 4; j < chunk[i].length ; j++){
                var chunkInBinary = chunkBinary(chunk[i][j]);   
                console.log(chunkInBinary);    
     }
 }

问题是chunkInBinary的值总是未定义的,当我在chunkBinary函数中打印它时,我能够查看它。我试图使用闭包但由于某种原因我无法使用它。请建议。

1 个答案:

答案 0 :(得分:0)

正如其他人所指出的那样,chunkBinary()现在没有返回任何东西(你的return result;语句特别返回到nobody,因为onloadend被框架本身调用,因此值被抛弃了)。

因为FileReader执行异步读取,所以不能直接从它返回值。如果您希望调用者能够访问返回值,您需要使用类似ES6的承诺:

function chunkBinary(chunkFile){
    return new Promise(
      function(resolve, reject) {
        var reader = new FileReader();
        reader.onloadend = (function(reader)
        {
          function()
          {
            console.log(reader.result);
            resolve(reader.result);
          }
        })(reader);
        reader.readAsBinaryString(chunkFile);
      });
}

然后,当读取完成时,调用者可以访问该值:

chunkBinary(file).then(function(binaryString) {
  // do something with result here
});