- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 html5 filereader API 在本地获取照片,而无需用户上传它们。
在支持它的浏览器中,我允许进行多项选择,因此我循环选择的文件并对每个文件执行一个函数 (TC.editor.renderSlide()),如下所示:
handlePhotoUploads: function(event) {
var self = this;
TC.dialog.destroy();
var files = event.target.files;
var count = files.length + TC.editor.cache.slides.length;
for (var i = 0, f; f = files[i]; i++) {
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
var index = TC.editor.getNewSlidesIndex();
TC.editor.addNewSlide('photo', index);
reader.onload = (function(theFile) {
var slideindex = index;
return function(e) {
TC.editor.renderSlide(slideindex, e.target.result, 'internal', count);
};
})(f);
reader.readAsDataURL(f);
}
},
问题在于 TC.editor.renderSlide() 函数可能需要大量时间来执行(执行 Canvas 和 DOM 操作),因此在处理 8 个左右的大图像文件时,浏览器会被大量锁定的时间。在此期间,即使是“正在处理的 gif”也会停止动画。
有没有办法确保每个 reader.onload 事件仅在前一个事件完成后触发?通过这种方式,用户将通过单独查看每次调用 TC.editor.renderSlide() 的结果而不是在处理所有内容时锁定浏览器的当前情况来定期更新进度?
我试过向 renderSlide() 添加一个简单的 setTimeout 没有效果?
如有任何帮助或想法,我们将不胜感激。
最佳答案
onload
事件按顺序触发,处理程序不会在当前处理另一个处理程序时执行(“JS 是单线程的”)。当您在处理程序中开始一些异步处理(超时、动画、文件加载)时,这当然不算数。
在这种情况下,您将需要手动处理顺序处理。使用等待进程队列很容易,等待进程在完成时执行:
var waiting = [];
// …create many parallel loaders, and on each:
….onevent = execute;
function execute(e) {
if (waiting.active)
waiting.push(e);
else {
waiting.active = true
// do something that takes its time, supplying a
… function callback(ready) {
waiting.active = false;
if (waiting.length)
execute(waiting.shift()); // go on with next
}
}
}
但是,在我看来,不是 renderSlide
导致了问题,而是您同时实例化了这么多 FileReader
。通过将您的 for 循环变成一个异步调用的“递归”函数,让它们一个接一个地开始加载文件:
var files = […]
(function handle(i) {
if (i >= files.length) return;
// create loader
….onevent = function(e) {
// do processing, and then call
handle(i+1);
// or call that from another callback if you want to do async
// processing, like "renderSlide"
};
})(0);
关于javascript - 有没有办法让多个 html5 filereader.onload 事件按顺序触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13167756/
我是一名优秀的程序员,十分优秀!