【发布时间】:2019-08-23 10:00:07
【问题描述】:
我想知道我的小节点脚本是否毫无意义或过度使用 async/await。我的目标是尝试并行查找和解析尽可能多的文件。我的想法是它会更快。
我的节点脚本遍历目录和任何子目录并查找 .docx 文件。当它找到它们时,它会通过Mammoth 运行它们,将它们转换为 .html 文件。它只是将它们放在类似的目录结构中。
我的代码有效,但我是否过度使用 async/await?是否有一些地方我可以消除它们的使用,因为没有理由在我所在的地方使用它们?
const createTempDirs = async (catMap) => {
try {
const dirPromises = catMap.map((cat) => fs.mkdir(`issue/${cat.abv}`, {
recursive: true,
}));
await Promise.all(dirPromises);
} catch (error) {
console.log(error);
}
};
const writeToFile = (fileName) => {
return async (result) => {
//return await fs.writeFile(`issue/${fileName.replace('.docx', '.html')}`);
try {
const [
,
category,
...parts
] = fileName.split(' ');
await createTempDirs(catMap),
await fs.writeFile(`issue/${getShortCatName(category)}/${fileName.replace('.docx', '.html')}`, result.value);
} catch (error) {
console.log(error);
}
};
}
const fileToHTML = async (file, dirPath) => {
try {
const fileDetails = await fs.lstat(dirPath + file);
if (fileDetails.isDirectory()) {
walkDir(dirPath + addTrailingSlash(file));
}
if (!fileDetails.isDirectory() && path.extname(file) === '.docx') {
mammoth.convertToHtml({
path: dirPath + file,
}, conversionOptions).then(writeToFile(file));
}
} catch (error) {
console.log(error);
}
};
const processFiles = async (files, dirPath) => {
try {
const filePromises = files.map(file => fileToHTML(file, dirPath));
return await Promise.all(filePromises);
} catch (error) {
console.log(error);
}
};
const walkDir = async (dirPath) => {
try {
const files = await fs.readdir(dirPath);
processFiles(files, dirPath);
} catch (error) {
console.log(error);
}
};
walkDir(dirPath);
【问题讨论】:
-
我看到的主要问题是所有
try/catches。当出现错误时,您究竟希望发生什么?是要停止当前文件解析,还是停止当前目录解析,还是停止整个脚本,还是什么? -
@CertainPerformance 在尝试熟悉 async/await 时,我读过的每个资源似乎都在重申同一点,那就是在使用 async/await 时始终使用 try/catch。但也许在我是新人的时候,我读错了,而且在我不需要的时候做得过火了。
-
你能解释一下当你遇到错误时你想要发生什么吗?
-
使用 async/await 时有关 try/catch 的建议更接近于“从不”而不是“总是”。
-
除了日志记录,当错误发生时您要寻找的操作逻辑是什么?继续当什么事都没发生过?停止一切?这就是重构所依赖的
标签: javascript node.js async-await