Saltar al contenido

FileReader onload con resultado y parámetro

Contamos con tu ayuda para compartir nuestras reseñas referente a las ciencias de la computación.

Solución:

Intente envolver su función de carga en otra función. Aquí el cierre le da acceso a cada archivo que se procesa a su vez a través de la variable f:

function openFiles(evt)
    var files = evt.target.files;

    for (var i = 0, len = files.length; i < len; i++) 
        var file = files[i];

        var reader = new FileReader();

        reader.onload = (function(f) 
            return function(e) 
                // Here you can use `e.target.result` or `this.result`
                // and `f.name`.
            ;
        )(file);

        reader.readAsText(file);
    

Para una discusión de por qué se requiere un cierre aquí, consulte estas preguntas relacionadas:

  • Cierre de JavaScript dentro de bucles: ejemplo práctico simple
  • ¿Problema de bucle infame de Javascript?

Debe usar el cierre en el controlador 'onload'. Ejemplo: http://jsfiddle.net/2bjt7Lon/

reader.onload = (function (file)  // here we save variable 'file' in closure
     return function (e)  // return handler function for 'onload' event
         var data = this.result; // do some thing with data
     
)(file);

Usar

var that = this;

para acceder a variables externas en el alcance de la función.

function()
    that.externalVariable //now accessible using that.___

Mi escenario: uso de Angular 9. Luché con esto durante mucho tiempo, simplemente parecía que no podía hacerlo funcionar. Encontré lo siguiente como una solución realmente elegante para acceder a variables externas dentro de un function() bloquear.

public _importRawData : any[];

importFile(file){
    var reader = new FileReader();
    reader.readAsArrayBuffer(file);

    var data;
    var that = this;  //the important bit

    reader.onloadend = await function()
        //read data

        that._importRawData = data;  //external variables are now available in the function
    

Una de las partes importantes en el código anterior es el var palabra clave, que abarca variables fuera del bloque de funciones. Sin embargo, cuando accedí al valor de data después del bloque de funciones, todavía no estaba definido como la función ejecutada después del otro código. Intenté async y await, pero no pude hacerlo funcionar. y no pude acceder data fuera de esta función.

La gracia salvadora fue la var that = this línea. Usar eso permite acceder a variables externas dentro de la función. Entonces podría establecer esa variable dentro del alcance de la función y no preocuparme por cuándo se ejecuta el código. Tan pronto como se ha leído, está disponible.

Para la pregunta original, el código sería:

function openFiles(evt)
    var files = evt.target.files;
    for (var i = 0; i < files.length; i++) 
        var file=files[i];
      
        var that = this; //the magic happens
      
        reader = new FileReader();
        reader.onload = function()
            var data = $.csv.toArrays(this.result,separator:'t');
          
            that.file.name //or whatever you want to access.
        ;
        reader.readAsText(file);
    

Si posees alguna incertidumbre o forma de enriquecer nuestro enunciado eres capaz de dejar una crítica y con mucho placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *