[Vuejs]-How can I make return works in load function on vue component?

2πŸ‘

βœ…

A nice way to handle asynchronous validation is by using Promises :
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

If you are targeting Internet Explorer, make sure to use a polyfill such as this one :
https://github.com/stefanpenner/es6-promise
Your code would then look like this :

onFileChange(e) {
  let self = this
  this.validate(e.target.files[0])
    .then(function() {
      let files = e.target.files,
        reader = new FileReader()
      // if any values
      if (files.length) {
        reader.onload = (e) => {
          self.image = e.target.result
        }
        reader.readAsDataURL(files[0])
      }
    })
    .catch(function() {
      // do something in the case where the image is not valid
    })
},
validate(image) {
  let self = this
  return new Promise(function(resolve, reject) {
    // validation file type
    if (!self.allowableTypes.includes(image.name.split(".").pop().toLowerCase())) {
      reject()
    }
    // validation file size
    if (image.size > self.maximumSize) {
      reject()
    }
    // validation image resolution
    let img = new Image()
    img.src = window.URL.createObjectURL(image)
    img.onload = function() {
      let width = img.naturalWidth,
        height = img.naturalHeight

      window.URL.revokeObjectURL(img.src)

      if (width != 850 && height != 350) {
        reject()
      } else {
        resolve()
      }
    }
  })
}

If you do not want or cannot use Promises you could use a Callback to achieve the same behaviour :

onFileChange(e) {
  let self = this
  let validCallback = function() {
    let files = e.target.files,
      reader = new FileReader()
    // if any values
    if (files.length) {
      reader.onload = (e) => {
        self.image = e.target.result
      }
      reader.readAsDataURL(files[0])
    }
  }
  let unvalidCallback = function() {
    // do something in the case where the image is not valid
  }
  this.validate(e.target.files[0], validCallback, unvalidCallback)

},
validate(image, validCallback, unvalidCallback) {
  // validation file type
  if (!this.allowableTypes.includes(image.name.split(".").pop().toLowerCase())) {
    unvalidCallback()
    return
  }
  // validation file size
  if (image.size > this.maximumSize) {
    unvalidCallback()
    return
  }
  // validation image resolution
  let img = new Image()
  img.src = window.URL.createObjectURL(image)
  let self = this
  img.onload = function() {
    let width = img.naturalWidth,
      height = img.naturalHeight

    window.URL.revokeObjectURL(img.src)

    if (width != 850 && height != 350) {
      unvalidCallback()
      return
    } else {
      validCallback()
    }
  }
}

0πŸ‘

It’s onloadend not onload.

Change your code to this:

let self = this;     

var reader = new FileReader(); 
reader.onloadend = () => {
 // you logic here (use self, not this)
}
πŸ‘€samayo

Leave a comment