【问题标题】:How to generate a zip file synchronously using JSZip?如何使用 JSZip 同步生成 zip 文件?
【发布时间】:2021-12-27 15:30:13
【问题描述】:

我正在开发一个 React.js 应用程序,我有一个从 j=1j=2000 的循环,我想在 j 时下载一个 zip 文件=1 或 j=2000。

问题是循环结束后两个zip文件同时下载。换句话说,两个 zip 的下载在 j = 2000 时开始。

我尝试使用 async 和 await 使 zip 生成同步,但它对我不起作用。

const generateCollection = async ()=>{
    for(var j = 1; j <= 2000; j++){
      let zip = new JSZip();
      let metadata = zip.folder("metadata");
      const obj = {name: "Simple name", age: "Simple age"}
      metadata.file(`1.json`, JSON.stringify(obj, null, 4))

      console.log("Start Downloading: ", j)
      if(j===1 || j===2000){
        await zip.generateAsync({type:"blob"})
        .then(content=>{
          setIsLoading(false)
          FileSaver.saveAs(content, `collection_${j}.zip`);
          console.log("Saved...... ", j)
        })
      }
    }
 }

我将不胜感激任何帮助或建议!

【问题讨论】:

    标签: javascript reactjs async-await es6-promise jszip


    【解决方案1】:

    这里的问题不在于 generateAsync 方法,而在于 saveAs,它会延迟到 cpu 可用并且无法等待,如此处报告的那样:

    https://github.com/eligrey/FileSaver.js/issues/389

    一种解决方案可能是根本不等待,而是将循环转换为异步事件,让浏览器有时间在迭代之间显示保存对话框:

    const generateCollection = ()=> {
        var j = 1;
        const loop = function() {
            if (j <= 2000) {
                let j2 = j; //Create a local copy of the loop var
                let zip = new JSZip();
                let metadata = zip.folder("metadata");
                const obj = {name: "Simple name", age: "Simple age"};
                metadata.file(`1.json`, JSON.stringify(obj, null, 4));
                
                console.log("Start Downloading: ", j)
                if (j2===1 || j2===2000){
                    zip.generateAsync({type:"blob"})
                    .then(content=>{
                        saveAs(content, `collection_${j2}.zip`);
                        console.log("Saved...... ", j2)
                    });
                }
                j++;
                setTimeout(loop, 0);
            }
        };
        setTimeout(loop, 0);
    }
    
    $(function() {
            generateCollection();
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js"></script>

    请注意,由于安全限制,上述代码在小提琴中不起作用,您必须将其放在其他地方。

    【讨论】:

    • 它有效,谢谢。我真的很感谢你的努力......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2020-09-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多