首页 > 解决方案 > 第二个异步等待函数未调用

问题描述

我试图先解压缩一个文件,然后等待该解压缩文件完成,然后再循环遍历每个文件并将其上传到 S3 存储桶。第一个函数unzipPromise运行良好,所有内容都在正确的目录中解压缩,但uploadS3Promise根本没有运行。我没有在这个过程中遇到错误,它只是运行并解压缩文件并且从不触及该uploadS3Promise功能。

function unzipInput(file, client, project_number, oldpath, newpath) {
    path = `zips/${client}/${project_number}/${file}/`;
    function unzipPromise() {
        return new Promise((resolve, reject) => {
            fse.mkdirsSync(path);
            fs.rename(oldpath, newpath, err => {
                if (err) {
                    throw err;
                }
            });
            fs.createReadStream(newpath).pipe(unzip.Extract({ path }));
        });
    }
    function uploadS3Promise() {
        console.log("running");
        return new Promise((resolve, reject) => {
            // fs.unlinkSync(newpath);
            fs.readdirSync(newpath).forEach(file => {
                uploadToS3(file, client, project_number, path);
                console.log(file, "test");
            });

            if (err) reject(err);
            else resolve("success");
        });
    }
    // New code with async:
    (async () => {
        try {
            await unzipPromise();
            await uploadS3Promise();
        } catch (e) {
            console.error(e);
        }
    })();
}

标签: javascriptpromiseasync-awaitfs

解决方案


您应该resolve在解压缩路径完成或reject发生错误后调用。而且由于流是 EventEmitter,你可以监听事件并与之交互

const stream = fs.createReadStream(newpath).pipe(unzip.Extract({ path }))
stream
.on('error', (err) => reject(err))
.on('finish', () => resolve())

推荐阅读