javascript - NodeJS异步操作未在同步操作执行之前的初始执行中完成
问题描述
我正在编写一个小的 NodeJS 脚本,它需要一个 zip 文件并将内容提取到一个文件夹中。然后,我在文件系统上搜索提取的 zip 内容以查找指定的文件类型,然后将其输出到数组。
我面临的问题是脚本的初始运行,在我的“findFile”函数启动之前提取过程没有完成。为了解决这个问题,我尝试使用 Async/Await,我希望在成功完成解压缩/提取后启动“findFile”功能。
下面是一个简化的代码示例:
const fs = require('fs-extra');
const unzipper = require('unzipper');
const path = require('path');
const artifact = 'C:\\PATH\\TO\\MY\\ZIP\\FILE.zip;
const dir = 'C:\\PATH\\TO\\MY\\EXTRACTED\\ZIP\\FILE\\CONTENTS';
const findFile = function (dir, pattern) {
const results = [];
fs.readdirSync(dir).forEach(function (dirInner) {
dirInner = path.resolve(dir, dirInner);
const stat = fs.statSync(dirInner);
if (stat.isDirectory()) {
results = results.concat(findFile(dirInner, pattern));
}
if (stat.isFile() && dirInner.endsWith(pattern)) {
results.push(dirInner);
}
});
return results
}
const readZip = async () => {
fs.createReadStream(artifact).pipe(unzipper.Extract({path: 'C:\\LOCATION\\WHERE\\EXTRACTED\\ZIP\\WILL\\GO'}))
await findFile(dir, ".iar");
}
readZip()
最初运行上述内容时,我得到以下信息:
“UnhandledPromiseRejectionWarning:错误:ENOENT:没有这样的文件或目录,scandir 'C:\PATH\TO\EXTRACTED\ZIP\CONTENTS'”
但是,在第二次运行代码时,我得到了预期的结果:
[
'C:\\PATH\\TO\\SOME\\FILE.iar',
'C:\\PATH\\TO\\SOME\\FILE.iar',
'C:\\PATH\\TO\\SOME\\FILE.iar'
]
这种行为告诉我“findFile”函数在提取过程完成之前执行。这让我回到了这个问题:
问题1: 为什么“findFile”函数在执行之前没有使用“await”来完成提取过程?
问题 2: 谁能提供一些代码示例,说明如何在仍然使用我已经编写的代码的同时实现这一点?
我宁愿不必重写整个脚本,因为我相对确定这是我的句法问题,并且由于我是重写整个脚本的新手,所以我需要相当长的时间才能完成。任何和所有的帮助表示赞赏....