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

Node.js使用JSZip生成压缩包时async/await未等待执行完成问题

问题根因

你写的dozipping函数虽然标记了async,但内部调用的zip.generateAsync是异步方法,你既没有用await等待它执行完成,也没有将它返回的Promise抛出,导致外层的await dozipping()实际上等待的是一个立即完成的空Promise,不会等压缩逻辑执行结束,就会继续往下执行打印zipstring、修改s为done的逻辑,等压缩异步任务实际完成后,才会触发.then里的赋值和doing打印,就出现了和预期不符的输出顺序。

修正方案

把dozipping里的.then写法替换为await写法,等待压缩方法执行完成后再做后续赋值操作,这样外层的await dozipping()就能准确等到压缩流程结束才继续往下走。

修正后完整代码

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");
  // 等待压缩异步方法执行完成,拿到返回结果
  const content = await zip.generateAsync({ type: "binarystring" });
  console.log("doing");
  zipstring = content;
}
async function status() {
  console.log(s)
  await dozipping();
  console.log(zipstring)
  s = "done";
  console.log(s)
}
status(); 

补充说明

如果要混用async/await和.then写法,也可以选择在dozipping里返回zip.generateAsync的Promise,写法如下:

async function dozipping() {
  zip.file("Hello.txt", "Hello World\n");
  // 抛出异步任务的Promise,让外层await可以等待该任务完成
  return zip.generateAsync({ type: "binarystring" })
     .then(function(content) {
       console.log("doing");
       zipstring = content;
     });
}

两种写法都可以达到预期的输出效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:45:03