No estoy completamente seguro de cómo arreglar esto. Mi objetivo es llamar al lector de archivos en el documento de Excel y luego poder recuperar información adicional después de que se haya analizado el archivo. Pero la sincronización de FileReader es asíncrona, cuando voy a acceder a las propiedades de obj como obj.workbook, siempre imprime nulo. ¿Cómo resuelvo esto?
Entonces, en el código a continuación, notará que después de llamar a 'parse()' llamo a console.log('obj.workbook:', obj.workbook) que imprime nulo en la consola. Esperaría que imprima el valor del libro de trabajo asignado en el método de parse llamado anterior.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script> <script> class ExcelDoc { constructor(file) { this.file = file; this.workbook = null; } // Methods parse() { var reader = new FileReader(); reader.onload = () => { this.workbook = XLSX.read(reader.result, { type: 'binary' }); }; reader.onerror = function(ex) { console.log(ex); reader.abort(); }; reader.readAsBinaryString(this.file); } } function handleFileSelect(evt) { var files = evt.target.files; var obj = new ExcelDoc(files[0]); obj.parse() console.log('obj.file:', obj.file) console.log('obj.workbook:', obj.workbook) console.log('obj:', obj) } </script> <form enctype="multipart/form-data"> <input id="upload" type=file name="files[]"> Sheets <select id="sheetSelector"> <option>Choose a sheet</option> </select> </form> <textarea class="form-control" rows=35 cols=120 id="xlx_json"></textarea> <script> document.getElementById('upload').addEventListener('change', handleFileSelect, false); </script>