JavaScript 中 FileReader 的异步/等待问题

2024-04-20

我在 Vue.js 项目中使用 FileReader,并且此代码有问题:

async uploadDocuments(files) {
    for (let file of files) {
        let fileName = file.name;
        let fileContent;
        let reader = new FileReader();
        reader.onload = async () => {
            fileContent = reader.result;
            await this.submitFile(fileContent, fileName, fileType)
                .then(/* THEN block */)
                .catch(/* CATCH block */);
        };
        reader.onerror = (error) => { console.warn(error); };
        reader.readAsDataURL(file);
    }
    console.log("COMPLETED");
}

async submitFile(fileContent, fileName, fileType) {
    // this function should handle the file upload and currently contains a timeout
    await new Promise((resolve) => setTimeout(resolve, 3000));
}

这是所需的执行顺序(具有两个文件的示例):

  1. (等待3秒)
  2. THEN 块(文件 1)
  3. (等待3秒)
  4. 然后阻止(文件 2)
  5. 完全的

但这是实际的执行顺序:

  1. 完全的
  2. (等待3秒)
  3. 然后阻止
  4. 然后阻止

“THEN 块”在超时后正确执行,但执行中的代码for循环继续而不等待执行onload功能。

如何使阅读器异步?我尝试了很多解决方案(例如将for循环一个承诺并把resolve()内部功能.then())但它们都不起作用。


我建议“承诺” Reader 的事情,然后使用Promise.all直到所有文件上传完毕。

uploadDocuments = async (event, files) => {
  const filePromises = files.map((file) => {
    // Return a promise per file
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = async () => {
        try {
          const response = await this.submitFile(
            reader.result,
            file.name,
            fileType
          );
          // Resolve the promise with the response value
          resolve(response);
        } catch (err) {
          reject(err);
        }
      };
      reader.onerror = (error) => {
        reject(error);
      };
      reader.readAsDataURL(file);
    });
  });

  // Wait for all promises to be resolved
  const fileInfos = await Promise.all(filePromises);

  console.log('COMPLETED');

  // Profit
  return fileInfos;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中 FileReader 的异步/等待问题 的相关文章

  • 在反应中将索引从一个函数传递到另一个函数

    我有一个项目列表 单击删除按钮后该项目将被删除 我知道执行此操作的步骤 但我不知道如何将密钥传递到 dlt item 范围 http jsfiddle net 3Ley7uac 1 http jsfiddle net 3Ley7uac 1
  • 服务器重新启动时显示等待页面

    我有一个服务器并为其创建一个 Web 界面 如果用户按下页面上的重新启动按钮 则用户将被重定向到reboot php他应该看到一个旋转 gif 直到服务器再次可访问并且服务器通过 shell 执行重新启动 如果服务器可以访问 那么我需要重定
  • Flot 中轴的逗号分隔数字

    有没有办法让 Flot 使轴编号以逗号分隔 例如 用 1 000 000 代替 1000000 您可以通过使用轴的tickFormatter 属性来做到这一点 xaxis tickFormatter function val axis in
  • Node.js npm mssql 函数返回未定义

    我使用 mssql 和 node js 连接到 sql server 数据库 我试图通过将连接代码包装在具有一个查询参数的函数中来减少代码 当我从 router get 函数中的 with 调用该函数时 它返回未定义 任何帮助将非常感激 f
  • 如何从主体上的 onClick 事件获取鼠标单击的绝对位置?

    我试图获取鼠标单击相对于浏览器 主体的绝对位置 顶部和左侧 not主体内的任何父元素 我有一个绑定到 body 的侦听器 但 e pageX 和 e pageY 为我提供了相对于 div 的位置 请注意 我可以利用 jQuery 和 YUI
  • 在 Angular 中将图像 url 转换为 base64

    我正在努力尝试将给定的图像 url 转换为 base64 在我的例子中 我有一个带有图像路径的字符串 var imgUrl assets logoEmpresas empresa logoUrl 我如何直接将给定的图像网址转换为base64
  • jQuery:在方法上取消绑定 jQuery 2.0

    在 jQuery 1 9 中live 已被弃用 因此新方法变为 document on mouseover blahblahfunc 我无法解除 blahblahfunc 的绑定 通过 unbind mouseover mouseout c
  • TSConfig JSX:React JSX 与 React

    在将 Typescript 与 React 一起使用时 我们必须指定jsx in compilerOptions in tsconfig json file It has preserve react react native react
  • Javascript 闭包问题

    所以 我仍在阅读 Apress Pro Javascript 技术 但我在闭包方面遇到了麻烦 正如约翰 雷西格所说 闭包允许您引用父函数中存在的变量 然而 它在创建变量时并不提供变量的值 它提供父函数中变量的最后一个值 这是最常见的问题 您
  • ReactJs / Typescript:如何扩展状态接口

    我有以下内容 interface EditViewState
  • RxJS 将三元组中的属性组合到表中

    我有一项服务生成类似于三元组的对象 它们将采用以下格式 country attribute value Example country usa attribute population value 100 country mexico at
  • JavaScript 中 == 和 === 的区别[重复]

    这个问题在这里已经有答案了 有什么区别 and 在 JavaScript 中 我也见过 and 运营商 还有更多这样的运营商吗 看看这里 http longgoldenears blogspot com 2007 09 triple equ
  • Angular 8 - 删除 ng-component 标签 - 表行模板

    我有一个灵活的表格组件 有两种模式 普通表 有效 自定义行模板 这不是因为角度添加
  • HTML5:从存储的二进制字符串播放视频

    我正在尝试使用 FileReader readAsBinaryString Blob File 将视频文件的内容作为二进制字符串读取 如示例中所示http www html5rocks com en tutorials file dndfi
  • 如何仅使用 Javascript 减慢平滑滚动的默认速度?

    我的目标是按回车键 然后让网站滚动到底部 我已将滚动行为设置为平滑 一切都正常工作 除了平滑滚动的默认速度太快了 我怎样才能减慢它的速度 下面是我的代码 请不要使用jquery 谢谢你 document body onkeyup funct
  • 如何从对象 URL 获取文件或 blob?

    我允许用户通过拖放和其他方法将图像加载到页面中 当图像被删除时 我正在使用URL createObjectURL转换为对象 URL 以显示图像 我不会撤销该网址 因为我会重复使用它 所以 当需要创建一个FormData对象 以便我可以允许他
  • 在画布中的鼠标位置放大/缩小

    我正在尝试使用 p5 js 实现缩放功能 当前缩放级别以及 x 和 y 位置存储在controls view目的 默认位置或 0 0 位置位于左上角 问题是调整放大 缩小时的 x 和 y 位置值 以便无论视图的当前位置是什么 它都会停留在缩
  • 监听鼠标事件……除了 div 的溢出:滚动滚动条?

    关于如何监听 mousedown 的任何建议 document exceptdiv 的溢出 滚动滚动条 我不确定滚动条是什么元素is为了参考它 您可以使用以下命令自行检查目标 document on mousedown function e
  • 在客户端将大文件(> 2GB)压缩为 ZIP

    我使用构建上传工具node js and socket io 因为他们通常会上传令人难以置信的巨大文件 而普通的上传表单将无法工作 问题是他们想在发送之前将文件压缩成zip 以提高传输效率 我一直在研究压缩方法 例如JSZip http s
  • JavaScript 有内置的 stringbuilder 类吗?

    I see a few 代码项目解决方案 http www codeproject com KB scripting stringbuilder aspx 但是JavaScript中有常规的实现吗 如果您必须为 Internet Explo

随机推荐

  • 为什么我的递归阶乘方法总是返回 0? [复制]

    这个问题在这里已经有答案了 我创建了一个递归方法来计算数字的阶乘 但是 它总是返回 0 我不明白为什么 我在下面提供了我的代码 public class projectTwenty public static void main Strin
  • 在其他列定义的窗口内累积应用

    我试图将函数累积地应用于由 开始 和 完成 列定义的窗口内的值 因此 开始 和 完成 定义了值处于 活动 的时间间隔 对于每一行 我想获得当时所有 活动 值的总和 这是一个 暴力 示例 它实现了我想要的功能 是否有更优雅 更快或更有效的内存
  • store.sync() 回调

    store sync 有回调吗 我正在尝试这样做 store sync function alert 1 但它不起作用 这家店是当地的一家店 sync 没有 回调 为了实现此行为 您需要监听存储的写入事件 查看这个解决方案 https st
  • 如何在 awk 中对模式进行 if else 匹配

    我尝试过以下命令 awk search pattern print 1 如何编写上述命令的 else 部分 经典方式 https www gnu org software gawk manual gawk html If Statement
  • React Native 中的响应式图像

    我从 Facebook API 获取一些图像 我想将它们显示为响应式 宽度为 100 高度为自动 问题似乎是 React Native 裁剪了我的图像 我尝试了这些解决方案 解决方案1 https stackoverflow com a 3
  • iOS:同时使用 WiFi 和移动数据

    Setup 我的项目涉及一个 WiFi 相机 它创建一个 WiFi 热点 为了在相机上流式传输视频预览 浏览媒体 用户需要连接到相机的热点 Problem 用户无法同时使用 3G 4G 上的蜂窝数据 因为 iOS 设备已通过 WiFi 连接
  • SSLHandshakeException:握手期间远程主机关闭连接

    论坛上充斥着这个问题 但我找不到解决方案 我尝试连接 WS 但没有成功 我尝试更新 cacerts 文件 但没有效果 日志是 Allow unsafe renegotiation false Allow legacy hello messa
  • Code::Blocks 中的 wxWidgets 字体错误“GetWeightClosestToNumericValue() 中断言“numWeight > 0”失败”

    最近 每当我使用 Code Blocks 时 都会不断弹出错误对话框 它显示 此应用程序中的调试错误已失败 和 include wx font h 282 在 GetWeightClosestToNumericValue 中断言 numWe
  • 使用 com.zaxxer.hikari.HikariDataSource 时出错

    我在将 HikariCP 与 Spring 的 JdbcTemplate 集成时遇到错误 我正在使用 Spring 3 2 2 HikariCP 2 3 8 和 sybase jconn4 版本 7 0 0 弹簧配置
  • 为什么 cppreference 将 type_traits xxx_v 快捷方式定义为内联 constexpr 而不仅仅是 constexpr?

    为什么 cppreference 将 type traits xxx v 快捷方式定义为inline constexpr不仅仅是constexpr 例如 参见is integral v http en cppreference com w
  • 在 shell 中用字符串替换变量

    我将一个字符串作为参数传递给 shell 脚本 shell 脚本应该告诉我传递的参数是否是变量 像这样的东西 if z 1 then echo yes 1 is a variable and its value is 1 fi 但这给了我严
  • python子进程在引号前发送反斜杠

    我有一个字符串 它是一个应该在命令行中执行的框架命令 cmdToExecute TRAPTOOL a 字符串 ABC o 字符串 XYZ 我正在考虑该字符串具有应从命令提示符触发的整个命令 如果仔细查看字符串 cmdToExecute 您可
  • MySQL表不存在错误,但它确实存在

    有谁知道什么条件下可以收到1146 Table
  • 如何覆盖 sbt 中对某些任务的依赖

    我想在某些任务中覆盖对项目的依赖 我有一个使用 Spark 的 sbt 多项目 lazy val core Some Project val sparkLibs Seq org apache spark spark core 1 6 1 v
  • 实体框架中的集合值参数?

    在我的上一个项目中 我决定使用实体框架 一切都很顺利 直到我尝试使用 在哪里 我收到一个错误 经过一番小小的搜索后我想出了这个帖子 https stackoverflow com questions 110314 linq to entit
  • 调用 Pyramid 中的另一个视图

    我的目标 在 Pyramid 中 调用另一个可调用视图 并获得一个Response在不知道有关该视图可调用的任何详细信息的情况下拒绝返回 在我的 Pyramid 应用程序中 假设我有一个使用 view config 装饰器定义的视图 foo
  • Azure 函数中的内存缓存

    需要缓存对象以提高我的 Azure 函数的性能 我尝试了 NET ObjectCache System Runtime Caching 它在我的测试中运行良好 测试的缓存保留期长达 10 分钟 为了推进这个解决方案 我有几个简单的问题 Az
  • 如何为网页上的文本绘制添加动画效果?

    我想要一个网页 其中有一个居中的单词 我希望用动画绘制这个单词 以便页面以与我们相同的方式 写 出该单词 即它从一个点开始 随着时间的推移绘制直线和曲线 以便最终结果是一个字形 我不在乎这是否完成
  • 断言列表时,assertEquals 到底检查什么?

    在我的测试中 我断言我返回的列表是我刚刚创建的列表按字母顺序排列的列表 assertEquals 到底检查什么 它检查列表的顺序还是仅检查其内容 因此 如果我有一个 Fred Bob Anna 列表 那么列表中的 2 个 Anna Bob
  • JavaScript 中 FileReader 的异步/等待问题

    我在 Vue js 项目中使用 FileReader 并且此代码有问题 async uploadDocuments files for let file of files let fileName file name let fileCon