首页 文章

第二个异步等待函数没有调用

提问于
浏览
0

我试图首先解压缩文件,然后等待解压缩文件完成,然后我遍历每个文件并将其上传到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);
        }
    })();
}

3 回答

  • -1

    就个人而言,我会使用.then稍微打破这个过程 .

    unzipPromise().then(res => {
        console.log('resolved promise 1');
        uploadS3Promise();
    } rej => {
        console.log('rejected promise 1, sorry!');
    });
    

    此外 - “unzipInput”永远不会被解决或拒绝 .

  • 0

    uploadS3Promise无法运行,因为代码仍在等待unzipPromise完成 . 除非您解决或拒绝承诺,否则代码将不会进一步执行 .

    所以你的代码......

    function unzipPromise(){
        ...
        resolve(...)
        ...
    }
    

    在一个不相关的说明中,我认为如果不将函数名称命名为promise,那将更具可读性 . 就像把它们称为unzip和uploadS3一样 . 我们通常不会通过返回类型来命名我们的函数,就像我们从不说intIndexOf一样,依此类推 .

  • 0

    你应该在解压缩路径完成后调用 resolve 或者如果发生错误则调用 reject . 由于流是EventEmitter,您可以收听事件并与之交互

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

相关问题