同步操作执行前,NodeJS异步操作在初始执行时未完成

时间:2020-05-21 12:19:13

标签: javascript node.js function asynchronous async-await

我正在编写一个小的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()

最初运行上述代码时,我得到以下信息:

“ UnhandledPromiseRejection警告:错误: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: 谁能为我提供一些代码示例,说明我如何在仍利用已编写的代码的情况下实现这一目标?

我宁愿不必重写整个脚本,因为我相对确定这是我的语法问题,并且由于我是新手,因此重写整个脚本将花费我很多时间。完成。任何帮助都将不胜感激。...

0 个答案:

没有答案