reactjs: как обновить переменную вне функции reader.onload () изнутри функции?

У меня такой код:

  handleFile(files) {
    
    var file = files[0];
    var reader = new FileReader();
    var dataSet;
    
    reader.onload = function(file) {
      var arrayBuffer = reader.result;
      var byteArray = new Uint8Array(arrayBuffer);
      var kb = byteArray.length / 1024;
      var mb = kb / 1024;
      console.log('kb', kb, 'mb', mb)
      
      dataSet = dicomParser.parseDicom(byteArray);
      console.log('within function: ', dataSet)
      
    };

    reader.readAsArrayBuffer(file);

    console.log('outside reader.onload function: ', dataSet)
}

Когда приведенный выше код запускается,kb а такжеmb напечатать иconsole.log('within function: ', dataSet) печатается. Я могу подтвердить, что dataSet имеет значение.

Тем не мение,console.log('outside reader.onload function: ', dataSet) Говорит, чтоdataSet являетсяundefined .

Как я могу обновитьdataSet переменная изнутриonload функция?

Источник
Codelisting
за 1 против
Лучший ответ

Вы можете воспользоваться преимуществом async await, чтобы он выглядел как синхронный код + новые методы чтения blob на основе обещанийblob.arrayBuffer()

async function handleFile (files) {
    var file = files[0]
    var KiB = file.size / 1024
    var MiB = KiB / 1024
    console.log('KiB', KiB, 'MiB', MiB)

    var arrayBuffer = await file.arrayBuffer()
    var byteArray = new Uint8Array(arrayBuffer)
    var dataSet = dicomParser.parseDicom(byteArray)
    
    console.log(dataSet)
}

Также, если вы делите на 1024, используйте правильные единицы KiB и MiB https://en.wikipedia.org/wiki/Byte#Multiple-byte_units

  • 0
    Это работает как шарм. Я кое-что узнал. Спасибо.
за 1 против

вам нужно дождаться вызова onload, прежде чем вы сможете его вывести.

В настоящий момент происходит следующее:

   var dataSet = undefined;
   // reader onload hasn't been called yet.
   console.log('outside reader.onload function: ', dataSet)

reader.onload запускается после console.log

как таковой, попробуйте это:

 handleFile(files) {
    
    var file = files[0];
    var reader = new FileReader();
    var dataSet;

    function performOutput() {
     console.log('outside reader.onload function: ', dataSet)
    }
    reader.onload = function(file) {
      var arrayBuffer = reader.result;
      var byteArray = new Uint8Array(arrayBuffer);
      var kb = byteArray.length / 1024;
      var mb = kb / 1024;
      console.log('kb', kb, 'mb', mb)
      
      dataSet = dicomParser.parseDicom(byteArray);
      performOutputHere();
      
    };

    reader.readAsArrayBuffer(file);

    
}

Или, если его чище для вас.

reader.onloadend = function() {
      console.log('what does dataset look like now? ', dataSet)
};
Codelisting
Популярные категории
На заметку программисту