Javascript 捕捉回调异步函数完成的时刻

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();

我有以下代码来呈现用于上载的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();
    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回调时,从计数器中减去一,并检查它是否为零。如果是这样,请进行最后的回调。这就是承诺,一切都是这样。