第二个异步等待功能未调用

时间:2018-09-07 14:45:05

标签: javascript promise async-await fs

我尝试先解压缩文件,然后等待该解压缩文件完成,然后再遍历每个文件并将其上传到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 个答案:

答案 0 :(得分:0)

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

所以在您的代码中...

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

在不相关的注释上,我认为不命名函数名称以promise结尾更容易理解。就像只是叫他们解压缩并上传S3一样。我们通常不会通过正确的返回类型来命名函数,就像我们从来没有说过intIndexOf一样,依此类推。

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

我个人会使用.then来分解该过程。

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

而且-“ unzipInput”永远不会被解析或拒绝。