Filereader与Promise的搭配使用/JavaScript异步回调函数返回值(一)

Filereader与Promise的搭配使用/JavaScript异步回调函数返回值

工作中项目需求:读取用户上传的Excel文件,并将Excel转换为json数据格式,然后上传至后台数据库。

问题点:Filereader中new Filereader.onload = function()为异步回调函数,reader中获取到的数据无法传递到主函数外部。

解决办法一:

利用Promise对象的resolve和reject方法。

详细代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!--页面内容-->
<input type="file" onchange="readfls(this.files)" id="sss">
<button id="vvv">点击上传数据(假的,在后台打印了,证明数据能获取到)</button>
<!--页面内容-->

<script src="../static/js/jquery.min.js"></script>
<script src="../static/js/xlsx.core.min.js"></script>  <!--解析Excel的js插件-->
<script>
    //文件流转换BinaryString
    function fixData(data) {
        var o = "",
            l = 0,
            w = 10240;
        for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
        o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
        return o;
    }

    //读取文件
    var ImportFile = null;

    function readfls(fls) {
        if (fls && fls.length > 0) {
            ImportFile = fls[0];
            console.log(ImportFile);
            var fileX = ImportFile.name.split(".").reverse()[0];
            var fileXyes = false;
            ["xlsx", "xlc", "xlm", "xls", "xlt", "xlw", "csv"].forEach(function (value, index, array) {
                if (fileX === value) {
                    fileXyes = true;
                }
            });
            if (fileXyes) {
                file2Xce(ImportFile).then(function (t) {
                    console.log("数据解析完成了,做点什么事···");
                    if (t && t.length > 0) {
                        console.log('.then--->', t)
                    }
                });
            } else {
                alert("格式错误!请重新选择");
            }
        }
    }

    //开始将Excel文件读取为JSON数据格式
    var rABS = true;
    var wb; //读取完成的数据
    function file2Xce(f) {
        return new Promise(function (resolve, reject) {
            var reader = new FileReader();
            reader.onload = function (e) {
                var data = e.target.result;
                if (rABS) {
                    wb = XLSX.read(btoa(fixData(data)), { //手动转化
                        type: 'base64'
                    });
                } else {
                    wb = XLSX.read(data, {
                        type: 'binary'
                    });
                }
                var data2 = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
                resolve(data2);
            };
            if (rABS) {
                reader.readAsArrayBuffer(f);
            } else {
                reader.readAsBinaryString(f);
            }
        });
    }

    //点击事件,获取读取到的json
    $('#vvv').click(function () {
        var file = document.getElementById('sss');
        // console.log(file.files[0]);
        file2Xce(ImportFile).then(function (t) {
            console.log("获取到数据了,刚才点击了准备上传了");
            if (t && t.length > 0) {
                //在这里可以使用解析后的json了,想干嘛干嘛
                console.log('.vvv  click--->', t)
            }
        });
    })
</script>
</body>
</html>

配图一:

1

配图二:

1

最后:第二个方法下篇文章再记录!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

5coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值