jszip 在处理数据之前等待创建 zip

jszip wait for creation of zip before working with data

正在使用 JSZip 的 nodejs 实现创建二进制字符串格式的 zip 文件并将其值存储在全局变量中,但是尽管使用 async/await zipstring 在压缩过程完成之前被打印出来,

到目前为止,这是我的代码:

const JSZip = require("jszip");
const zip = new JSZip();
let s="not yet done";
let zipstring = "";
async function dozipping() {
  zip.file("Hello.txt", "Hello World\n");
  zip.generateAsync({ type: "binarystring" })
     .then(function(content) {
       console.log("doing");
       zipstring = content;
     });
}
async function status() {
  console.log(s)
  await dozipping();
  console.log(zipstring)
  s = "done";
  console.log(s)
}
status(); 

预期输出

not yet done
doing 
*zipstring value*
done

我目前得到的输出

not yet done
done

doing

我是 node 的新手,第一次使用 jszip,文档有点混乱,如果问题太小,提前道歉

这是因为 zip.generateAsync 中的 .then 不会停止执行。你将需要使用

zipstring = await zip.generateAsync(...);

Await 暂停异步函数的执行,直到 promise 得到解决。

你一无所获的原因是 promises 是异步的,一旦异步任务完成且状态为 fulfilledrejected,它们就会被调用。我对它做了一些修改:

const zip = new JSZip();
let s="not yet done";
let zipstring = "";
async function dozipping(){
      zip.file("Hello.txt", "Hello World\n");
      try {
        console.log("doing");
        const response = await zip.generateAsync({type:"binarystring"});
        zipstring = response;
        return response;
      } catch (error) {
        console.error(error); 
      }  
}
async function status(){
   try {
    console.log(s)
    await dozipping();
    console.log(zipstring)
    s="done";
    console.log(s)
   } catch (error) {
     console.error(error);
   }
    
}
await status(); 

我建议您先了解一下 promise 的工作原理以及 async\await 应该如何使用。它们只是它的语法糖。我正在通过它们附加 link