迭代:Reader.OnLoad

时间:2018-04-24 10:19:22

标签: javascript for-loop base64 orientation onload

我认为我已经非常接近为自己解决这个问题,但我不能让最后一部分工作,所以希望得到一些帮助。我花了最近几周试图用StackOverflow的各种资源写这篇文章,尽管我在这个过程中学到了很多东西,但我现在处于想要的阶段。让它工作(沮丧!)

运行脚本时,它只提供一个按钮,可以接受多个要选择的文件。对于所选的每个文件,我真正需要的是Base64图像数据。我设法做到了这一点但是从获得这些数据后发现,我的一些图像是颠倒的!

所以..我再次离开,做了一些研究,并提出了几个功能; a)检测图像方向是否需要调整..和b)根据需要进行调整。虽然我还没有包含它们,但您会看到对这2个函数的引用。由于我现在遇到的问题,似乎还没有完全测试。

所以我在这里添加了一些警报命令,所以我可以看到流程,我运行脚本并向我显示第一个arrayCounter。然后它给出了我正在处理的文件的名称(我知道),然后它应该跳转到fileRead.onload函数并开始做更多的处理。在这个阶段,如果我说选择了5个文件,它似乎经历了5次for循环,但只处理数组中的最后一个文件?希望这是有道理的。

我不太明白为什么它只处理最后一个。好吧,我有点理解,但我无法修复它。我知道它与fileRead.onload的异步运行有关,我试图通过使用闭包来使其工作。

我希望能用以下内容提醒我:

arrayCounter:0 > 文件名:myFile.jpg > 在onload .. myFile.jpg >

但它似乎是这样的:

arrayCounter:0 > 文件名:myFile1.jpg > arrayCounter:1 > 文件名:myFile2.jpg等

直到它到达第5个文件,然后它进入检查文件方向的部分,但只进行最后一个。我无法在每个文件上运行它,也许我需要fileRead.onload实例的单独实例?

我希望这是有道理的。它并没有按照我预期的顺序流动。 我做错了什么!



function encodeImageFileAsURL() {

  var filesSelected = document.getElementById("inputFileToLoad").files;
  var arrayCounter = 0;
  var imageList = [];

  for (arrayCounter = 0; arrayCounter < filesSelected.length; arrayCounter++) {

    var fileToLoad = filesSelected[arrayCounter];
    alert("arrayCounter: " + arrayCounter);

    var fileReader = new FileReader();
    alert("filename: " + fileToLoad.name);

    fileReader.onload = (function(fileLoadedEvent) {
      return function(e) {

        alert("inside onload...  " + fileToLoad.name);

        var srcData = e.target.result; // base64 data
        alert(srcData);

        alert("now we check orientation... arrayCounter: " + arrayCounter);
        getOrientation(fileToLoad, function(orientation) {
          if (orientation == 1) {
            imageList.push(srcData);
            alert("orientation not reset - arrayCounter is: " + arrayCounter);
          } else {
            resetOrientation(URL.createObjectURL(fileToLoad), orientation, function(resetBase64Image) {
              imageList.push(resetBase64Image);
              alert("orientation reset - arrayCounter is: " + arrayCounter);
            });
          }
        });

      }

      //bubble_fn_1(imageList);
    })(fileToLoad);

    fileReader.readAsDataURL(fileToLoad);
  }
}
&#13;
<!-- Learn about this code on MDN: https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL -->

<input id="inputFileToLoad" type="file" accept="image/*" multiple="true" style="opacity: 100" onchange="encodeImageFileAsURL();" />
&#13;
&#13;
&#13;

0 个答案:

没有答案