【JavaScript】FileReader读取文件成功,但存储的数据为空——总结

news2024/9/23 3:26:01

目录

  • 问题
  • 解决

问题

如题,使用下列代码读取上传的文件:
在这里插入图片描述

for (let i = 0; i < files.length; i++) {
    const reader = new FileReader();
    const fileName = files[i].name;
    reader.onload = function(e) {
        file_datas[fileName] = e.target.result;
    }
    // 根据需要设置读取模式:'text' 或 'binary'
    reader.readAsText(files[i]);
}

但是通过debugconsole.log输出的file_datas都为空,并没有任何数据。

这时候尝试在在循环的过程中输出数据,发现是可以输出结果的。

解决

也就是说,中间赋值的时候值是存在的,那么 有可能是变量的作用域问题或者其它。

但是变量是在函数外定义的,所以排除作用域的问题。

真正的原因是:FileReader读取文件是异步的,所以在代码执行完但是还未读取完,所以可能出现空值的情况。

这时候将代码修改,用Promise 或 async/await 等方式来处理异步操作的结果:

        function readFile(file) {
            return new Promise((resolve, reject) => {
                const reader = new FileReader();
                reader.onload = function(e) {
                    resolve(e.target.result);
                };
                reader.onerror = function(e) {
                    reject(e);
                };
                reader.readAsText(file);
            })
        }

        async function handleFiles(files, engine, recommend_method, single_or_multiple, epoch, num_train, cnt_limit) {
            const file_datas = {};
            const promises = [];
            for (let i = 0; i < files.length; i++) {
                const fileName = files[i].name;
                const promise = readFile(files[i])
                .then(fileContent => {
                    file_datas[fileName] = fileContent;
                })
                .catch(error => console.log(error));
                promises.push(promise);
            }
            await Promise.all(promises);
            // console.log(file_datas);
            // 等待文件读取完成后再发送数据
        }

        handleFiles(files, engine, recommend_method, single_or_multiple, epoch, num_train, cnt_limit);

将处理函数放在文件读取完毕后即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频搜索AI平台,输入关键词全网查找相关内容

体验网站链接&#xff1a;https://avse.vercel.app GitHub网站链接&#xff1a;GitHub - yoeven/ai-video-search-engine 原文地址&#xff1a;视频搜索AI平台&#xff0c;输入关键词全网查找相关内容-喜好儿aigc 这个平台允许用户通过类似自然语言的查询方式搜索视频&#x…

UML建模(下午题)

内容概要 用例图 类图与对象图 顺序图 活动图 状态图 通讯图 试题一 试题二 来源于软件设计师学习视频&#xff08;仅供学习参考&#xff0c;附历年真题及详解&#xff09;_哔哩哔哩_bilibili的网课记

力扣经典面试题——搜索旋转排序数组及最小值(二分搜索旋转数组系列一次搞定)

我们先来看看一个常规的二分搜索是如何进行的&#xff1f; 例如要找一个有序数组的某个数 【1&#xff0c;2&#xff0c;4&#xff0c;5&#xff0c;9&#xff0c;11&#xff0c;15&#xff0c;19】 我们要找11&#xff0c;每次我们分割半边判断然后看到底在哪一边。 这里为什么…

【ASCII码】最完整详细介绍

目录 ASCII码的引入 ASCII码的表达方式 ASCII码解释 常见ASCII码的大小规则&#xff1a; 标准ASCII码&#xff08;128位&#xff09; 扩展ASCII码&#xff08;256位&#xff09; 参考资料 ASCII码的引入 在计算机中&#xff0c;所有的数据在存储和运算时都要使用二进制数…

前端H5实现微信授权

背景: 前段时间做了一个H5项目&#xff0c;H5项目需要放在微信公众号里面,并且需要通过微信授权拿到openId,所以就需要实现h5授权微信这个功能了。 原理: 其实原理就是前端在本项目首页去请求微信端提供的一个地址,并且在地址上配置微信所需要的参数,比如最重要的就是你要配…

每日一题——LeetCode160.相交链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1&#xff1a;示例2&#xff1a;提示&#xff1a; 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的…

3.docker 安装失败

1、错误描述 2、报错前操作 ① 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken ② 更新本地镜像源 # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

改善OEE的关键:从反应性维护向预测性维护转变

科技的进步正在对企业的日常运营模式产生影响。许多制造企业已经采用了自动化生产流程&#xff0c;这不仅提高了产品质量&#xff0c;还简化了设备维护流程&#xff0c;并使得制造企业的设备维护方式从反应性维护转变为预测性维护。人们发现&#xff0c;设备维护方式的转变显著…

8.16 PowerBI系列之DAX函数专题-客户购买商品关联度的分析

需求 实现 1 客户数 countrows(values(sales[customerkey]))2 同时购买A和B的客户数 var A_cust values(sales[customerkey]) // var b_cust calculatetable(values(sales[customerkey]),usereletionship(product b[productkey],sales[productkey]),//激活虚拟关系all(p…

Java 基础学习(十七)多线程高级

1 多线程并发安全&#xff08;续&#xff09; 1.1 synchronized方法 1.1.1 synchronized方法 与同步代码块不同&#xff0c;同步方法将子线程要访问的代码放到一个方法中&#xff0c;在该方法的名称前面加上关键字synchronized即可&#xff0c;这里默认的锁为this&#xff0…

国外加固Appdome环境检测与绕过

文章目录 前言第一部分&#xff1a;定位检测逻辑的通用思路1. 通过linux“一切皆文件”思路定位2. 分析现有检测软件猜测可能检测点3. 通过正向开发思路定位4. 通过activity及弹窗定位 第二部分&#xff1a;检测结果展示整体流程1. Jni反射调用doDispath完成广播发送2. NativeB…

Redis案例实战之Bitmap、Hyperloglog、GEO

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

数据安全技术措施

目录 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 ~over~

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说&#xff0c;缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏&#xff0c;也因此导致了开发效率的骤降。这也使得例如libevent这类事件库&#xff08;基础组件库&#xff09;一时间大红大紫。 今天&#xff0c;码哥给大家带来一款基础库&#…

Mybatis如何兼容各类日志?

文章目录 适配器模式日志模块代理模式1、静态代理模式2、JDK动态代理 JDBC Logger总结 Apache Commons Logging、Log4j、Log4j2、java.util.logging 等是 Java 开发中常用的几款日志框架&#xff0c;这些日志框架来源于不同的开源组织&#xff0c;给用户暴露的接口也有很多不同…

Ascon加解密算法分析

参数定义 加密架构图 整个过程是在处理320bits的数据&#xff0c;所以在最开始需要对原始的数据进行一个初始化&#xff0c;获得320bits的数据块&#xff0c; 图里看到的pa和pb都是在做置换&#xff08;对320bits的数据进行一个置换&#xff09; 置换&#xff08;Permutation&…

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

04&#xff5c;提示工程&#xff08;上&#xff09;&#xff1a;用少样本FewShotTemplate和ExampleSelector创建应景文案 当你用 print 语句打印出最终传递给大模型的提示时&#xff0c;一切就变得非常明了。 您是一位专业的鲜花店文案撰写员。 对于售价为 50 元的 玫瑰 &…

c++使用强制转换类型

对于c中的强制转换&#xff0c;这里主要是讲解的是父类与子类之间的类型强制转换。对于以下的代码中&#xff0c;主要是父类Monkey和子类Man之间的成员函数的调用。 // 这是父类 class Monkey { public&#xff1a; // 定义一个纯虚函数 virtual void printFunc() { qDeb…

udp多播/组播那些事

多播与组播 多播&#xff08;multicast&#xff09;和组播&#xff08;groupcast&#xff09;是相同的概念&#xff0c;用于描述在网络中一对多的通信方式。在网络通信中&#xff0c;单播&#xff08;unicast&#xff09;是一对一的通信方式&#xff0c;广播&#xff08;broad…

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.…