首页 > 解决方案 > 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: 谁能提供一些代码示例,说明如何在仍然使用我已经编写的代码的同时实现这一点?

我宁愿不必重写整个脚本,因为我相对确定这是我的句法问题,并且由于我是重写整个脚本的新手,所以我需要相当长的时间才能完成。任何和所有的帮助表示赞赏....

标签: javascriptnode.jsfunctionasynchronousasync-await

解决方案


推荐阅读