关于外部无法访问reader.onload内生成值的解决办法

这两天在写大文件上传时遇到一个需求:要将文件生成SHA1(hash)发送给后台,在使用reader.onload函数时无法将数据保存到该函数外部,尝试网上的办法均无效,今天终于解决了,做个笔记

需求:给选中的file对象生成hash,标识唯一值

//生成hash的函数
// utils.js

// file: 即将上传的file对象
//由于onload是异步读取的,如果在onload函数体下一行直接console.log是无法读取到值的,这个涉及到事件循环,以后有机会再写
export function getHash(file) {
  return new Promise(function (resolve, reject) {
    let reader = new FileReader();
    reader.readAsArrayBuffer(file);
    reader.onload = () => {
      let wordArray = CryptoJS.lib.WordArray.create(reader.result);
      let hash = CryptoJS.SHA1(wordArray).toString();
      resolve(hash);
    }
  })
}

外部使用

//fileUpload.js
//在要对文件进行操作的地方进行调用这个函数,但是要在原来的函数前使用async/await,同样的原因:onload是异步的
async  uploadFile(file){
  //其余逻辑忽略
  let hash = "";
  hash = await getHash(file);// 在这里,不要写.then ,直接将getHash赋值给一个变量就行了
  console.log(`hash1111111`, hash); 
}
// 

一般retrun promise 都需要 async await 等待他完成,一位来自于百度大厂的老师这样告诉我.

2021年8月1日 今天又看到另一种方法 大同小异,做个笔记(传送门:
https://blog.csdn.net/youngeffort/article/details/89508646?utm_term=axios的put上传文件&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-1-89508646&spm=3001.4430)

async Photograph() {
      // 获取用户拍照的图片名字,显示到页面上
      this.fileName = this.$refs.photoref.files[0].name;
      // 获取图片base64 代码,并存放到 base64ImgData 中
      this.base64ImgData = await this.FileReader(this.$refs.photoref.files[0]);
    },
    /**
     * 返回用户拍照图片的base64
     */
    FileReader(FileInfo) {
      // FileReader 方法参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader
      let reader = new FileReader();
      // readAsDataURL 方法参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL
      reader.readAsDataURL(FileInfo);
      // 监听读取操作结束
      /* eslint-disable */
      return new Promise(
        resolve => (reader.onloadend = () => resolve(reader.result))
      );
    }
 

 

写下这篇博文的目的是为了让自己能记得清楚,希望再也不要犯低级的错误了

以上

作者:致爱丽丝
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接并标名原文作者,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/hjk1124/p/15084149.html