У меня такой код:
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
функция?
Вы можете воспользоваться преимуществом 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
вам нужно дождаться вызова 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)
};