VUE + 小程序 关于前端循环上传附件页面卡死的问题

最开始我使用for循环,后端能正常保存,但是前端页面卡死了,开始代码是这么写的

    wx.showLoading({
              title: '文件上传中...',
              mask: true // 是否显示透明蒙层,防止触摸穿透,默认:false
            });
            const {
              fileList
            } = that.data;
            that.setData({
              "fileResult": []
            });
            console.log("开始处理附件上传");
            for (var file of fileList) {
              uploadFile({
                "folder": "carfj",
                "fjlxdm": "CARFJ",
                "ywid": pkid
              }, file).then(res => {
                console.log("得到上传成功后的数据");
                console.log(res);
                const {
                  fileResult
                } = that.data;
                fileResult.push(res);
                that.setData({
                  "fileResult": fileResult
                });
              });
            }
            console.log("上传结果检查中...");
            while (true) {
              const {
                fileList,
                fileResult
              } = that.data;
              if (fileList.length == fileResult.length) {
                break;
              }
            }
            wx.hideLoading();

  

你当前的代码存在几个问题,导致前端没有得到上传文件的返回值:

  1. 异步操作未等待:你在循环中调用了 ​uploadFile​,但没有等待这些异步操作完成。因此,​while​ 循环会立即执行,而不是等待所有文件上传完成。
  2. 无限循环​while (true)​ 会导致无限循环,这会阻塞主线程,使得小程序无法响应其他事件。
  3. 数据更新问题​setData​ 是异步的,你在循环中更新 ​fileResult​,但这个更新可能不会立即反映在 ​that.data​ 中。

为了解决这些问题,你可以使用 ​Promise.all​ 来等待所有上传操作完成,而不是使用 ​while​ 循环。以下是修改后的代码:

//上传附件
            wx.showLoading({
              title: '文件上传中...',
              mask: true // 是否显示透明蒙层,防止触摸穿透,默认:false
            });
            const {
              fileList
            } = that.data;
            that.setData({
              "fileResult": []
            });
            console.log("开始处理附件上传");
            // 创建一个数组来存储所有的上传 Promise
            const uploadPromises = fileList.map(file => {
              return uploadFile({
                "folder": "carfj",
                "fjlxdm": "CARFJ",
                "ywid": pkid
              }, file).then(res => {
                console.log("得到上传成功后的数据");
                console.log(res);
                const {
                  fileResult
                } = that.data;
                fileResult.push(res);
                that.setData({
                  "fileResult": fileResult
                });
              });
            });
            // 等待所有上传操作完成
            Promise.all(uploadPromises).then(() => {
              wx.hideLoading();
              console.log("所有文件上传完成");


            }).catch(err => {
              console.log("文件上传失败", err);
              wx.showToast({
                title: "文件上传失败",
                icon: 'none',
                mask: true,
              });
              wx.hideLoading();
              return;
            });

相关推荐

  1. jquery、vue、uni-app、程序页面参方式

    2024-07-12 20:48:02       45 阅读
  2. 程序页面参?

    2024-07-12 20:48:02       27 阅读
  3. 程序页面路由方法?

    2024-07-12 20:48:02       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 20:48:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 20:48:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 20:48:02       57 阅读
  4. Python语言-面向对象

    2024-07-12 20:48:02       68 阅读

热门阅读

  1. Linux 命令个人学习笔记

    2024-07-12 20:48:02       18 阅读
  2. SpringBoot实现Read Through模式

    2024-07-12 20:48:02       20 阅读
  3. linux中vim切换输入中文

    2024-07-12 20:48:02       17 阅读
  4. 模型剪枝知识点整理

    2024-07-12 20:48:02       21 阅读
  5. 雅思词汇及发音积累 2024.7.12

    2024-07-12 20:48:02       23 阅读
  6. php上传文件

    2024-07-12 20:48:02       17 阅读
  7. linux kernel ptr dump

    2024-07-12 20:48:02       19 阅读
  8. 软设之备忘录模式

    2024-07-12 20:48:02       21 阅读
  9. Nginx 高效加速策略:动静分离与缓存详解

    2024-07-12 20:48:02       23 阅读