Javascript 无法理解异步函数中的多个等待
我编写这个函数是为了从几个目录中的一些svg文件生成png文件。我正在同步执行下面的功能,并且它按照预期工作(与下面的代码相同,但使用readFileSync),但被告知重新执行,以便仅使用promisified fs函数 当前代码跳过groupA和groupB中的两个文件,以及其交换宽度。例如,我注意到转换函数不会为Javascript 无法理解异步函数中的多个等待,javascript,async-await,Javascript,Async Await,我编写这个函数是为了从几个目录中的一些svg文件生成png文件。我正在同步执行下面的功能,并且它按照预期工作(与下面的代码相同,但使用readFileSync),但被告知重新执行,以便仅使用promisified fs函数 当前代码跳过groupA和groupB中的两个文件,以及其交换宽度。例如,我注意到转换函数不会为dirB的svg1生成,但会为dirA的svg1生成,尽管它的宽度与dirB的svg1不匹配 大多数文件转换正确,但少数文件不能。我猜这是一个时间问题,那么如何在保证fs功能的同时
dirB的svg1
生成,但会为dirA的svg1
生成,尽管它的宽度与dirB的svg1
不匹配
大多数文件转换正确,但少数文件不能。我猜这是一个时间问题,那么如何在保证fs功能的同时解决这个问题呢
const { createConverter } = require('convert-svg-to-png');
const fs = require('fs');
const path = require('path');
const util = require('util');
const readdir = util.promisify(fs.readdir);
const readFile = util.promisify(fs.readFile);
async function convertSvgFiles(dirPath) {
const converter = createConverter();
try {
const files = await readdir(dirPath);
for (let file of files) {
const currentFile = path.join(dirPath, fil);
const fileContents = await readFile(currentFile);
const fileWidth = fileContents.toString('utf8').match(\*regex capture viewbox width*\);
await converter.convertFile(currentFile, { width: fileWidth });
}
} catch (err) {
console.warn('Error while converting a file to png', '\n', err);
} finally {
await converter.destroy();
}
}
['dirA', 'dirB', 'dirC'].map(dir => convertSvgFiles(`src/${dir}`));
你的代码看起来不错。我没有看到任何明显的行为会导致您描述的行为-您等待函数中的每个承诺。您没有使用全局变量
我会说这句话:
['dirA', 'dirB', 'dirC'].map(dir => convertSvgFiles(`src/${dir}`));
最终在所有3个目录上并行运行函数,并有3个转换器实例。假设转换器中没有与并行相关的错误,这应该不会导致任何问题
但如果只是为了露齿而笑,请尝试将其改为:
async function run() {
for (let d of ['dirA', 'dirB', 'dirC']) {
await convertSvgFiles(`src/${d}`)
}
}
run()
强制按顺序扫描文件夹。如果这解决了问题,那么在将svg转换为png
中就有一个错误。您是否尝试过使用Promise.all
?