Javascript 捕捉回调异步函数完成的时刻
我有以下代码来呈现用于上载的select文件:Javascript 捕捉回调异步函数完成的时刻,javascript,html,asynchronous,Javascript,Html,Asynchronous,我有以下代码来呈现用于上载的select文件: //1 <input type="file" multiple id="my_html_uploader" /> //2 var files = myHtmlUploaderElem.files; if (files.length > 0) { for (var i = 0, file1; file1 = files[i]; i++) { var reader = new FileReader();
//1
<input type="file" multiple id="my_html_uploader" />
//2
var files = myHtmlUploaderElem.files;
if (files.length > 0) {
for (var i = 0, file1; file1 = files[i]; i++) {
var reader = new FileReader();
reader.onload = (function(file2, i2) {
return function(e) {
alert("done!");
};
})(file1, i);
reader.readAsDataURL(f);
}
}
//1
//2
var files=myHtmlUploaderElem.files;
如果(files.length>0){
for(var i=0,file1;file1=files[i];i++){
var reader=new FileReader();
reader.onload=(函数(file2,i2){
返回函数(e){
警报(“完成!”);
};
})(文件1,i);
reader.readAsDataURL(f);
}
}
我怎样才能抓住reader.onload(…)的回调已完成的时刻
a) 单独的文件
b) 所有文件都包含已选择的内容
?创建承诺,然后您可以使用
Promise.all
等待所有承诺:
const promises = []; // keep as much constant as possible
for (const file of files) { // way more beautiful, no need for an IIFE with "const" or "let"
let reader = new FileReader();
promises.push(new Promise((resolve, reject) => { // short for: function(resolve, reject) {
reader.onload = event => resolve(event.target.result);
reader.onerror = reject;
}));
reader.readAsDataURL(file);
}
Promise.all(promises).then(results => {
alert("all loaded");
// results is an array of file contents
}).catch(error => {
// one of the files failed to load, handle that here
});
创建承诺,然后您可以使用
Promise.all
等待所有承诺:
const promises = []; // keep as much constant as possible
for (const file of files) { // way more beautiful, no need for an IIFE with "const" or "let"
let reader = new FileReader();
promises.push(new Promise((resolve, reject) => { // short for: function(resolve, reject) {
reader.onload = event => resolve(event.target.result);
reader.onerror = reject;
}));
reader.readAsDataURL(file);
}
Promise.all(promises).then(results => {
alert("all loaded");
// results is an array of file contents
}).catch(error => {
// one of the files failed to load, handle that here
});
这在所有的浏览器中都有效吗,包括旧的浏览器?不,不会。将其传输回ES5以获得更好的支持。如何在ES5中做到这一点?这是否适用于所有浏览器,包括旧浏览器?不,不会。将其传输回ES5以获得更好的支持。如何在ES5中做到这一点?对于B部分,创建一个具有数组长度的全局变量。每次执行onload回调时,从计数器中减去一,并检查它是否为零。如果是这样,请进行最后的回调。这就是Promise.All所做的。对于B部分,使用数组的长度创建一个全局变量。每次执行onload回调时,从计数器中减去一,并检查它是否为零。如果是这样,请进行最后的回调。这就是承诺,一切都是这样。