Как синхронно получить размеры изображения в JavaScript

Проблема с получением размеров картинки

У меня есть задача получить ширину и высоту изображения синхронно, но мой код работает неправильно. Пробовал разные подходы, но результат всегда undefined.

Вот мой текущий код:

getPictureSize(imageUrl){
  var picture = new Image()
  picture.src = imageUrl
  picture.onload = function(){
    return [picture.width, picture.height]
  }
} 

readFileAsBase64(fileObj){
  let self = this
  let fileReader = new FileReader()
  fileReader.readAsDataURL(fileObj)
  fileReader.onload = function() {
    return fileReader.result
  }
}

async calculateImageSize(imageFile){
  let dataURI = await this.readFileAsBase64(imageFile)
  let dimensions = await this.getPictureSize(dataURI)
  return dimensions
}

handleImageUpload(evt){
  let imageDimensions = this.calculateImageSize(imageFile)
  imageDimensions = imageDimensions.split(",")
  console.log(imageDimensions[0], imageDimensions[1])
}

Мне нужно получить точные размеры в методе handleImageUpload без асинхронных операций. Как это можно реализовать правильно?

Проблема в том что твои функции не возвращают промисы. onload это коллбек, его return никуда не идет. Нужно обернуть в Promise:

getPictureSize(imageUrl){
  return new Promise((resolve) => {
    var picture = new Image()
    picture.onload = () => resolve([picture.width, picture.height])
    picture.src = imageUrl
  })
}

То же самое с FileReader - оборачивай в промис и делай resolve в onload. А в handleImageUpload добавь await перед calculateImageSize, иначе получишь объект Promise вместо результата.

Синхронно получить размеры картинки в браузере невозможно - загрузка изображений всегда асинхронная. Но можешь сделать функцию которая выглядит как синхронная используя async/await. Еще вариант - если работаешь с File объектом, попробуй createObjectURL вместо base64, быстрее работает. А зачем тебе именно синхронно нужно?

У тебя основная проблема в том что ты путаешь промисы с обычными функциями. В твоем коде getPictureSize вообще ничего не возвращает, а calculateImageSize пытается await-ить undefined. Еще заметил что в handleImageUpload ты вызываешь split на промисе - это точно не сработает. Попробуй сначала исправить readFileAsBase64 - там тоже нет return. И да, полностью синхронно в js с картинками не получится, но с правильным промисами будет работать как надо.