使用 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,檔案有點混亂,如果問題太瑣碎,請提前抱歉
uj5u.com熱心網友回復:
這是因為來自 zip.generateAsync 的 .then 不會停止執行。你需要使用
zipstring = await zip.generateAsync(...);
Await 會暫停異步函式的執行,直到 promise 得到解決。
uj5u.com熱心網友回復:
你一無所獲的原因是承諾是異步的,一旦異步任務完成,狀態為fulfilledor ,它們就會被呼叫rejected。我對其進行了一些更改:
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應該如何使用。它們只是它的語法糖。我正在通過他們附上鏈接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/355732.html
標籤:javascript 节点.js 异步等待 压缩包
