【发布时间】:2013-05-08 14:34:06
【问题描述】:
我在 for 循环中调用 FileReader API 来遍历多个文件对象。我正在使用 FileReader 来显示图像的预览。
function() {
for (var i in Files) {
var fileReader = new FileReader();
fileReader.readAsBinaryString(Files[i]);
fileReader.onload = function() {
// do something on FileReader onload
}
fileReader.onprogress = function(data) {
if (data.lengthComputable) {
var progress = parseInt( ((data.loaded / data.total) * 100), 10 );
console.log(progress);
}
}
}
// do something on completion of FileReader process
// actions here run before completion of FileReader
}
由于 FileReader API 的异步特性,我遇到了两个问题。首先,每个 FileReader 实例都会触发 onprogress 事件。这给了我每个文件的进度。然而,我打算显示所有文件而不是单个文件的总进度。
其次,我想执行仅应在 FileReader 的所有实例(每个文件一个)完成后执行的操作。目前,由于 FileReader 是异步运行的,因此操作会在 FileReader 完成其任务之前运行。我进行了很多搜索,但尚未找到解决这些问题的方法。任何帮助表示赞赏。
【问题讨论】:
-
在数字上使用
parseInt是一种反模式。如果要舍入(或截断)(data.loaded / data.total) * 100值,请使用Math.round或Math.floor。您也可以先执行* 100部分,这样中间值就不会那么小(因为它可能有助于防止精度损失):var progress = Math.round((data.loaded * 100) / data.total);
标签: javascript html filereader