【发布时间】:2021-05-03 09:44:21
【问题描述】:
我有一个小问题,如何以合理的方式创建一个promise链,让makeZip函数首先添加所有必要的文件,然后创建zip,最后删除之前添加的文件? (makeZip 函数也必须返回一个承诺)。在下面的示例中,我没有在任何地方调用 deleteFile,因为我不知道在哪里调用它。当我尝试在添加文件函数中调用它以在添加文件后立即删除文件时,由于某种未知原因,控制台显示了制作的 zip!先登录再删除文件。
const deleteFile = (file, result) => {
new Promise((resolve, reject) => {
fs.unlink(`./screenshots/${file}`, (err) => {
if (err) return reject(err);
console.log(`${file} deleted!`);
return resolve();
});
});
};
const addFile = (file) => {
new Promise((resolve, reject) => {
try {
zip.addLocalFile(`./screenshots/${file}`);
console.log(`${file} added`);
return resolve();
} catch {
return reject(new Error("failed to add file"));
}
});
};
const makeZip = () => {
Promise.all(fs.readdirSync("./screenshots").map((file) => addFile(file)))
.then(() => {
return new Promise((resolve, reject) => {
try {
zip.writeZip(`./zip_files/supername.zip`);
console.log("zip maked!");
resolve();
} catch {
return reject(new Error("failed making zip"));
}
});
})
.catch((err) => console.log(err));
};
【问题讨论】:
-
我认为你的程序无效,为什么
addFile()返回promise对象?zip.addLocalFile()和zip.writeZip()是异步的吗?如果是这样,您是否在zip.addLocalFile()和zip.writeZip()之前忘记了await? -
zip.addLocalFile和zip.writeZip实际上是异步的吗?如果是,您 promisified them wrong(在通话后立即解决,而不是在他们完成时解决 - 他们应该接受回调?),如果不是,您根本不需要将它们包装在new Promise中。 -
即使他 (@Vasper) 也忘记从每个函数返回承诺
标签: javascript node.js ecmascript-6