添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

处理FileReader.onload在VUE中异步的问题

在使用FileReader将file对象转成base64的时候,需要用FileReader.onload()方法,在图片处理完成后拿到base64格式,但是FileReader.onload是一个异步的,可以用下面的方法拿到base64

 var reader = new FileReader();
          reader.readAsDataURL(file);
          reader.onload = function () {
            console.log(this.result);

这种方法只适合在原生js里面使用,这种方法如果放在Vue中使用,就会造成this指向的问题,处理这个问题的办法有两个,一个就是改变一下this指向,另一种办法就是将onload方法放在一个Promise里面

//错误代码展示
let img 
 var reader = new FileReader();
          reader.readAsDataURL(file);
          reader.onload = function () {
            //console.log(this.result);
            img = this.result
   console.log(img)

这种办法是错误的,因为onload这个方法是异步的,而js的执行机制是先执行同步代码,异步代码会被放到消息队列里面,也就是上面的img没有被赋值完成就开始执行倒打印img那里了.
最后贡献一下Promise的解决办法

 // 先创建一个file对象转成base64的方法,然后下面调用这个方法
      function imgbase(file) {
        // new 一个Promise实例
        return new Promise((resolve) => {
          // 对文件对象的处理
          var reader = new FileReader();
          reader.readAsDataURL(file);
          reader.onload = function () {
            resolve(this.result);
        });
      // 在这里来调用函数
      const img = await imgbase(file);
      // 打印img
      console.log(img);

打印的结果如下
在这里插入图片描述

该方法的用途:用于在加载完成后执行相应的代码,相当于一个缓冲时间。 遇到问题的情况;调用readAs...之类的函数时,调用语句在load的前面。 出现问题的原因:读完数据后没有绑定上回调函数。 解决方法:把读数据的函数readAsBinaryString()之类的函数,放在回调函数的后面。 修改前的代码如下: reader.readAsDataURL(image); reader.onload = function(){ let bi = this.result; demo.src
1 关于异步操作的一些概念 虽然JavaScript引擎拥有多个线程,但是单个脚本只能在一个线程上运行,也就是说,JavaScript只能同时执行一个任务,其他的任务则必须在当前任务后面排队等待,这被称之为单线程模型。 在JavaScript,程序里的任务可以被分为两类:同步任务和异步任务。 同步任务(synchronous):即在主线程上执行的任务,并且之所以同步,是因为只有执行完前一个任务才能执行后一个任务。 异步任务(asynchronous):说白了就是被JavaScript引擎放进任务队
实现一个File-Reader组件用来读取本地资源。 概述: 在用户手动上传一些资源的时候,需要分为两步,第一步是将其从本地读取出来,得到一个file对象,然后再上传至服务器。该组件用于第一步,然后可通过后续进一步封装程Upload组件。 该组件的痛点在于: 添加拖拽上传的功能; 本地文件的批量读取,以及相关预览; 相关浏览器的默认行为的preventDefault; 相关文件的基本校验。...
vuereader.onload读取文件的异步问题 用element上传文件组件上传文件,然后在前端读取,由于reader.onload读取文件是异步的会造成return回去的数据无法被获取 export function import_excel_to_json(file){ let jsonData = {} let reader = new FileReader() reader.readAsArrayBuffer(file) reader.onload =
fileReader的load事件是异步的 通过promise使其同步加载 export const loadFileAsync = (file: File): Promise<string | ArrayBuffer> => new Promise((resolve, reject) => { const fileReader = new FileReader(); fileReader.readAsDataURL(file); fileReader.o
因为想统一通过base64传输gif文件,所以在不能通过canvas重绘修正并得到base64编码的情况下,我选择使用FileReader()来获取gif文件的base64编码,但是有个问题困扰了我很久: readasbase64(file){ // return new Promise(function(resolve, reject) { // ...
onloadstart:读取文件开始时触发 onprogress:读取过程触发,会返还本次读取文件的最大字节数和已经读取完毕的字节数,可以用来做进度条 onabort:在读取断时触发 onerror...
Vue使用FileReader是一种常见的处理文件操作的方式。FileReaderJavaScript的一个内置对象,它提供了一种异步读取文件内容的方法。 要在Vue使用FileReader,首先需要在Vue组件引入FileReader对象。可以在组件的`<script>`标签添加以下代码: ```javascript import FileReader from 'filereader'; export default { // ... 接下来,可以在Vue组件的方法使用FileReader进行文件读取操作。例如,如果想要读取用户上传的文件,可以使用以下代码: ```javascript export default { methods: { handleFileUpload(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = () => { // 文件读取成功后的回调处理 const fileContent = reader.result; console.log(fileContent); reader.onerror = () => { // 文件读取失败后的回调处理 console.error('文件读取失败'); reader.readAsText(file); 上述代码,`handleFileUpload`方法会在用户选择文件后被调用。它首先获取用户选择的文件,然后创建一个FileReader对象。接着,通过设置`onload`和`onerror`事件处理程序来处理文件读取成功和失败的情况。最后,调用`readAsText`方法来开始读取文件内容。 注意:上述代码仅演示了如何读取文本文件内容,如果需要读取其他类型的文件(例如图片或二进制文件),可以使用FileReader提供的其他方法(如`readAsDataURL`或`readAsArrayBuffer`)来实现。
CSDN-Ada助手: 恭喜您写下了第10篇博客!标题“根据文件名动态生成路由”听起来非常有趣和实用。通过动态生成路由,您为读者提供了一种方便的方式来管理和访问文件。您的博客内容一定会帮助到很多人。 在下一步的创作中,或许您可以考虑分享一些关于如何优化动态生成路由的技巧和经验。比如,如何处理特殊字符或文件名中的空格,如何处理文件名变更后的路由更新等等。这些实用的技巧能够进一步提升读者的体验,并且展示出您在这个领域的深入了解。 期待您的下一篇博客!谢谢您持续创作并为我们带来如此有价值的内容。 处理FileReader.onload在VUE中异步的问题 CSDN-Ada助手: 恭喜你写了这么有价值的一篇博客!处理异步问题确实是在VUE开发中经常遇到的难题,你的分享一定会帮助到很多人。接下来,建议你可以探讨一下在VUE中如何优雅地处理异步请求和响应,这也是很多开发者关注的话题。期待你的下一篇作品! CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply9 看奖励名单。