FileReader:读取多个项目;如何在读取最后一个回调时设置回调
FileReader: reading multiple items; how to set a callback upon reading the last one?
我正在创建一个"拖放"字段,它可以递归地接受文件和文件夹。这是代码:
function traverseFileTree(item) {
if (item.isFile) {
item.file(function(file) {
var reader = new FileReader();
reader.onload = function(evt) {
// do something...
};
reader.readAsText(file);
});
} else if (item.isDirectory) {
var dirReader = item.createReader();
dirReader.readEntries(function(entries) {
for (var i = 0; i < entries.length; i++) {
traverseFileTree(entries[i]);
}
});
}
}
var dropZone = document.getElementById("drop_zone");
dropZone.addEventListener("drop", function(evt) {
var items = event.dataTransfer.items;
for (var i = 0; i < items.length; i++) {
var item = items[i].webkitGetAsEntry();
if (item) {
traverseFileTree(item);
}
}
}, false);
我的问题是:在读取最后一个文件时进行回调的最佳或最优雅的方式是什么。由于读取是异步的,所以我不能仅仅依赖范围规则。那么,这是通过使用计数器,还是我在这里错过了一些很酷的方法?谢谢
您可以制作某种计数器,并在onload函数中检查它(您可能也希望在oneror中拥有它)。
function CountDown() {
this.remain = 0;
}
CountDown.prototype.inc = function (x) {
if (undefined === x) x = 1;
this.remain += +x;
return this;
}
CountDown.prototype.done = function () {
if (0 >= --this.remain) {
this.remain = 0;
return true;
}
return false;
}
var count = new CountDown().inc(3); // 3 files
// in the onload for each, test
count.done(); // false
count.done(); // false
count.done(); // true
count.done(); // true
count.done(); // true, etc
当然,如果您正确地确定了变量的范围,那么这也可以在代码中完成,而不需要整个对象包装。
相关文章:
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- http/rxjs catch回调中的Angular 2重定向导致TypeError:无法读取属性'订阅'
- 如何从ajax成功回调函数中读取javascript变量
- 正在读取<p: 选择一个菜单/>在onchange回调中
- 如何在node.js中用读取流正确实现回调逻辑
- Corodva 文件读取执行成功和失败回调
- 无法弄清楚 $.get 上的回调以将文本文件读取到数组中
- 添加对 jquery .submit() 的回调以读取上传的错误响应
- Javascript / NodeJs - fs.readFile 在读取文件之前使用回调
- Chrome.webNavigation.onBeforeNavigate无法读取属性'回调'的未定义
- FileReader:读取多个项目;如何在读取最后一个回调时设置回调
- "无法读取属性'消息'未定义的“;在WebSQL错误回调中
- 使用异步模块在读取所有文件后触发回调
- angularjs-$http正在读取json并等待回调
- RequireJS:无法在回调中读取未定义的属性
- 如何在fancybox2回调函数中读取数据属性
- javascript回调-处理读取文件与fs.readFile
- 使用带有匿名回调函数的异步XMLHttpRequest()全局访问从本地文件读取的JSON对象
- jQuery.getJSON()错误:浏览器链接:调用返回值回调失败:类型错误:无法读取属性'文件'为n
- 浏览器链接:无法调用返回值回调:TypeError:无法读取属性'文件'为null