You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swal.fire的preConfirm中FileReader未执行完就返回导致selectedfiles为空如何解决

解决方案

你遇到的问题本质是FileReader的读取操作属于异步回调逻辑,原代码的同步return语句不会等待回调执行,就返回了还未赋值的selectedfiles变量。
SweetAlert2的preConfirm钩子原生支持返回Promise实例,你只需将文件读取逻辑封装到Promise中,等读取完成/报错后再resolve最终要返回的表单对象即可,Swal会自动等待Promise执行完成再触发后续的确认后逻辑。

修复后代码

preConfirm: function () {
    return new Promise((resolve) => {
        let selectedfiles = "";
        const file = $('#files')[0].files[0];
        // 先获取同步读取的表单值
        const email = $('#email').val();
        const header = $('#header').val();
        const content = $('#content').val();

        // 无上传文件场景直接返回结果
        if (!file) {
            resolve({
                email: email,
                header: header,
                content: content,
                selectedfiles: selectedfiles
            });
            return;
        }

        // 有上传文件场景,等待读取完成后返回结果
        const reader = new FileReader();
        reader.readAsText(file, "UTF-8");
        reader.onload = function (evt) {
            selectedfiles = evt.target.result;
            resolve({
                email: email,
                header: header,
                content: content,
                selectedfiles: selectedfiles
            });
        }
        reader.onerror = function (evt) {
            selectedfiles = "error reading file";
            resolve({
                email: email,
                header: header,
                content: content,
                selectedfiles: selectedfiles
            });
            // 若需要读取错误时终止提交,可替换为以下写法
            // reject("文件读取失败,请重试");
        }
    })
},

优化建议

  • 搭配Swal的showLoaderOnConfirm: true配置使用,文件读取过程中会自动展示加载动画,避免用户重复操作
  • 若需要限制上传文件的大小、格式,可在文件读取前增加对应校验逻辑,不符合要求直接reject即可终止提交流程

内容的提问来源于stack exchange,提问作者Elias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 13:36:03