需要从附加到onload事件的函数返回变量

时间:2015-12-13 17:21:53

标签: javascript file onload

这是实际情况的一个例子。为了我的目的,我需要返回一个赋值给一个在onload事件处理程序中初始化的变量的值。它返回undefined。有没有办法返回变量?

在这种情况下,我需要从usefile函数返回元素变量。如何管理它。

<html>

<body>
<input type='file' id='up' accept='image/*' >
<script>
function fileread(e){
    if(window.FileReader && window.File && window.FileList){

       var file=e.target.files[0];
       var getElement=usefile(file);
       console.log(getElement); // prints 'undefined' 

   }    
}
function usefile(file){
   var reader=new FileReader();
   reader.onload=function(e){
       var element=getRandomElement();
       return element; // need to return it and assign it to getElement variable inside fileread function
   }
}
function getRandomElement(){
   var arr=[1,2,3];
   return arr[2]; // a random value for experiment purpose
}
document.getElementById('up').addEventListener('change',fileread,false);

</script>
</body>
</html>

2 个答案:

答案 0 :(得分:1)

当您同步执行所有操作时,返回值。您的案例中的异步部分来自读取文件所需的延迟。因此,您为其提供了一个在读取文件后调用的函数。

这意味着您还需要构建代码,以便稍后调用在读取文件后必须执行的部分。因此,您还需要将该逻辑移动到回调中。

简而言之,使用回调。这是一种方式......

function fileread(e) {
  if (window.FileReader && window.File && window.FileList) {

    var file = e.target.files[0];
    var getElement = usefile(file, function() {
      console.log(getElement); // does not print 'undefined' 
    });
  }
}

function usefile(file, callback) {
  var reader = new FileReader();
  reader.onload = function(e) {
    var element = getRandomElement();
    callback(element);
  }
}

function getRandomElement() {
  var arr = [1, 2, 3];
  return arr[2]; // a random value for experiment purpose
}
document.getElementById('up').addEventListener('change', fileread, false);
<input type='file' id='up' accept='image/*'>

答案 1 :(得分:1)

尝试使用FileReader onloadend事件

<html>

<body>
  <input type='file' id='up' accept='image/*'>
  <script>
    var reader, result = [];
    if (window.FileReader && window.File && window.FileList) {
      reader = new FileReader();

      function fileread(e) {
        var file = e.target.files[0];
        var getElement = usefile(file);
        reader.onloadend = function(e) {
          console.log(result)
        }
      }

      function usefile(file) {
        reader.onload = function(e) {
          var element = getRandomElement();
          // push `element` , `e.target.result` to `result` array
          result.push(element, e.target.result)
        }
        reader.readAsDataURL(file)
      }

      function getRandomElement() {
        var arr = [1, 2, 3];
        var r = arr[Math.floor(Math.random() * arr.length)];
        return r; // a random value for experiment purpose

      }
      document.getElementById('up').addEventListener('change', fileread, false);
    } else {
      alert("FileReader not supported")
    }
  </script>
</body>

</html>

或者,使用Promise

<html>

<body>
  <input type='file' id='up' accept='image/*'>
  <script>
    function fileread(e) {
      if (window.FileReader && window.File && window.FileList) {

        var file = e.target.files[0];
        var getElement = usefile(file);
        getElement.then(function(data) {
            console.log(data[0], data[1])
          })
      }
    }

    function usefile(file) {
      return new Promise(function(resolve) {
        var reader = new FileReader();
        reader.onload = function(e) {
          var element = getRandomElement();
          // resolve `Promise` with `element` , result of `FileReader`
          resolve([element, e.target.result])
            // return element; 
            // need to return it and assign it to getElement variable
            //  inside fileread function
        }
        reader.readAsDataURL(file)
      })
    }

    function getRandomElement() {
      var arr = [1, 2, 3];
      var r = arr[Math.floor(Math.random() * arr.length)];
      return r; // a random value for experiment purpose
    }
    document.getElementById('up').addEventListener('change', fileread, false);
  </script>
</body>

</html>