我可能只是不了解文件阅读器api,但是
当我尝试跑步时:
for (var i = 0, f1, f2; f1 = files[sorted_index[i]], f2 = files[sorted_index[i+1]]; i=i+2) {
var file_one;
var file_two;
if(f1.size < f2.size){
file_one = f1;
file_two = f2;
} else {
file_one = f2;
file_two = f1;
}
var file_one_contents;
var file_two_contents;
var reader = new FileReader();
reader.readAsText(file_one);
reader.onload = readSuccess;
function readSuccess(evt){
file_one_contents = evt.target.result;
}
var reader = new FileReader();
reader.readAsText(file_two);
reader.onload = readSuccess2;
function readSuccess2(evt2){
file_two_contents = evt2.target.result;
}
console.log(file_one_contents);
console.log(file_two_contents);
控制台日志中只包含 undefined 。 这两个脚本的目标是用两个CSV读取并从这对文件中获取数据并进行一些计算。
谢谢!
答案 0 :(得分:4)
API 异步。操作完成时会调用“success”函数,而不是立即执行。
将您的console.log()
电话移至内部处理程序功能。
编辑 - 如果您需要等待两个文件都准备好后才开始执行操作,您可以执行以下操作:
var countdown = 2;
var reader = new FileReader();
reader.readAsText(file_one);
reader.onload = readSuccess;
function readSuccess(evt){
file_one_contents = evt.target.result;
countdown--;
if (countdown === 0) go();
}
var reader = new FileReader();
reader.readAsText(file_two);
reader.onload = readSuccess2;
function readSuccess2(evt2){
file_two_contents = evt2.target.result;
countdown--;
if (countdown === 0) go();
}
当然,有更复杂的方法可以做到这一点,但是这个简单的技巧只需要等到计数器为零才能调用“go()”,这代表了处理文件的功能。
答案 1 :(得分:3)
我有一个类似的问题,通过使用“.onloadend”而不是“onload”来解决文件读取等待。在下面的代码中,x绑定到“div”元素
reader.onloadend = function (evt) {
x.innerHTML = evt.target.result;
}
使用“onload”时,它都是未定义的。