Вторая функция асинхронного ожидания не вызывается - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь сначала распаковать файл, а затем дождаться завершения распаковки файла перед тем, как перебрать каждый файл и загрузить его в корзину 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 голосов
/ 07 сентября 2018

uploadS3Promise не запускается, потому что код все еще ждет ing для завершения unzipPromise. Код не будет выполняться дальше, пока вы не решите или не отклоните обещание.

Так в вашем коде ...

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

На несвязанной ноте, я думаю, было бы более читабельным, чтобы имена функций не заканчивались обещанием. Как просто позвонить им распаковать и загрузить S3. Мы не называем нашу функцию обычно возвращаемыми типами правильно, как мы никогда не говорим intIndexOf и так далее.

0 голосов
/ 07 сентября 2018

Вы должны позвонить resolve после распаковки или reject, если произошла ошибка. А поскольку потоки являются EventEmitter, вы можете прослушивать события и взаимодействовать с ним

const stream = fs.createReadStream(newpath).pipe(unzip.Extract({ path }))
stream
.on('error', (err) => reject(err))
.on('finish', () => resolve())
0 голосов
/ 07 сентября 2018

Лично я бы использовал .then, чтобы немного сломать процесс.

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

Также - «unzipInput» никогда не разрешается и не отклоняется.

...