0

Помогите понять как сделать запись данних из файла в переменную HTML

<input type="file" id="file">
<button id="load">Load JSON File</button>

JS

document.querySelector("#load").addEventListener("click", function() {
  let file = document.querySelector("#file").files[0]
  let reader = new FileReader()
  let data;
  reader.onload = function(event) {
    data = event.target.result
    // console.log(reader.result);
  }
  reader.readAsText(file)
  console.log(data); // в консоли undefined
})
Epic Game
  • 29
  • 1
  • 6

1 Answers1

1

Ваша ошибка в том , что ваш код не синхронен. Т.е. reader.onload выполняется не сразу и в это время код идёт дальше. data не успевает получить значения перед тем как вывестись в консоль.

Вот вам сразу два решения

  1. Выводить внутри load
document.querySelector("#load").addEventListener("click", function() {
  let file = document.querySelector("#file").files[0]
  let data;
  let reader = new FileReader()
  reader.onload = function(event) {
    data = event.target.result
    // console.log(reader.result);
    console.log(data); 
  }
  reader.readAsText(file)

})

  1. Сделать функцию load синхронной
document.querySelector("#load").addEventListener("click", async function() {
    /// функция у клика async обратите внимание
    let file = document.querySelector("#file").files[0]
let data;

////ваш код

data = await loadFile(file)

console.log(data)

}) function loadFile(file){ return new Promise(resolve=>{ let reader = new FileReader()

    reader.onload = function(event) {
        let data = event.target.result
        resolve(data)
    }
    reader.readAsText(file)
})

}

HTO HOT
  • 1,333
  • Огромное спасибо, я пробовал делать через промис но не писал async await – Epic Game Aug 25 '21 at 18:19