__performUpload () {
    return new Promise((resolve, reject) => {
      if (!this.hasUploader()) {
        return reject(new Error('No uploader has been defined'))
      }
      Promise.all(this.files.map(file => {
        file.error = false
        file.complete = !!file.path
        return file.path ? Promise.resolve(file.path) : this.getUploader(
          file.file,
          (progress) => {
            file.progress = progress
            this.context.rootEmit('file-upload-progress', progress)
            if (progress >= 100) {
              if (!file.complete) {
                file.justFinished = true
                setTimeout(() => { file.justFinished = false }, this.options.uploadJustCompleteDuration)
              }
              file.complete = true
              this.context.rootEmit('file-upload-complete', file)
            }
          },
          (error) => {
            file.progress = 0
            file.error = error
            file.complete = true
            this.context.rootEmit('file-upload-error', error)
            reject(error)
          },
          this.options
        )
      }))
        .then(results => {
          this.results = this.mapUUID(results)
          resolve(results)
        })
        .catch(err => {
          throw new Error(err)
        })
    })
  }
Perform the actual upload event. Intended to be a private method that is
only called through the upload() function as chaining utility.