浏览器的异步行为导致多个文件下载时没有全部执行

此处用例涉及的传参urls,是一个用","拼接的文件url字符串,如"img1.jpg,img2.jpg,img3.jpg"

downloadFile(urls) {
            // 将URL字符串分割成数组
            const urlArray = urls.split(',');

            // 定义一个递归函数来处理每个URL
            function downloadNext(index) {
                if (index >= urlArray.length) return; // 所有文件下载完毕

                const url = urlArray[index].trim(); // 去除URL前后的空格
                console.log("当前下载文件url: ", url);

                // 创建一个隐藏的<a>标签
                const tempLink = document.createElement("a");
                tempLink.style.display = "none";
                tempLink.href = url;

                // 从URL中提取文件名和扩展名
                const filename = url.substring(url.lastIndexOf('/') + 1);
                tempLink.setAttribute("download", filename);

                // 如果浏览器不支持download属性,则打开新窗口
                if (typeof tempLink.download === "undefined") {
                    tempLink.setAttribute("target", "_blank");
                }

                // 将<a>标签添加到文档中并触发点击事件
                document.body.appendChild(tempLink);
                tempLink.click();

                // 移除<a>标签
                document.body.removeChild(tempLink);

                // 使用setTimeout确保每个文件下载请求之间有间隔
                setTimeout(() => {
                    downloadNext(index + 1);
                }, 1000); // 1秒间隔,可以根据需要调整
            }

            // 开始下载第一个文件
            downloadNext(0);
        }

浏览器的异步行为导致多个文件下载时没有全部执行,当一个文件下载请求被触发后,浏览器可能需要一些时间来处理这个请求,而在这段时间内,下一个文件的下载请求可能已经被触发,导致只有一个文件被下载。

解决这个问题,可以使用异步编程技术(如setTimeoutPromise)来确保每个文件下载请求之间有足够的间隔时间。以下是使用setTimeout的解决方案:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值