我有一个函数,它将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函数中打印它时,我能够查看它。我试图使用闭包但由于某种原因我无法使用它。请建议。
答案 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
});