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
相关产品推荐
相关产品推荐

