Как дождаться, пока все сжатые файлы будут извлечены

Для приведенного ниже кода в разделе code-1 я извлекаю содержимое файла .tar по определенному пути. Затем я хочу переименовать извлеченные файлы, как показано в коде. Количество извлеченных файлов — шесть, и я вижу их в списке vs-code обозревателя проекта. Проблема, с которой я столкнулся, заключается в том, что выполнение кода .on('finish') происходит быстрее, чем процесс извлечения сжатых файлов tar. Во время выполнения все процессы переименования завершаются, кроме последнего, упомянутого в коде, несмотря на Обозреватель проекта vs-code показывает, что в списке указан извлеченный файл с именем SysConstants.CONST_BAND_5_NAME.description.

Чтобы решить эту проблему, я поместил код процесса переименования внутрь setTimeout и выполнил код, после чего все шесть извлеченных файлов были переименованы. Итак, я пришел к выводу, что процесс извлечения все еще происходит, пока выполнение кода процесса переименования завершено.

В коде, показанном в разделе code-2, моя попытка решить эту проблему, но она также не сработала.

Как заставить процесс переименования произойти после извлечения всех шести файлов?

код-1:

onst tarStream = fs.createReadStream(pathToTarFileTobeExtracted);
tarStream.pipe(tarFs.extract(untarPath + outputFolderPerUntared + '\\' + outputFolderPerUntaredForTS2))
.on('finish', () => {
    setTimeout(() => {
        fs.renameSync(
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BANDS_COMPOSITE_NAME.description,
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[0]);
        fs.renameSync(
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_1_NAME.description,
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[1]);
        fs.renameSync(
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_2_NAME.description,
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[2]);
        fs.renameSync(
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_3_NAME.description,
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[3]);
        fs.renameSync(
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_4_NAME.description,
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[4]);
        fs.renameSync(
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_5_NAME.description,
            untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[5]);

            
        console.info('xcx ***** old:', untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_5_NAME.description)
        console.info('xcx ***** new:', untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[5])
    }, 1000);
})

код-2

Attempt to solve the problem

const tarStream = fs.createReadStream(pathToTarFileTobeExtracted);
        const extractedStream = tarFs.extract(untarPath + outputFolderPerUntared + '\\' + outputFolderPerUntaredForTS2);
        tarStream.pipe(extractedStream);
        extractedStream
        .on('close', () => {
            fs.renameSync(
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BANDS_COMPOSITE_NAME.description,
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[0]);
            fs.renameSync(
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_1_NAME.description,
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[1]);
            fs.renameSync(
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_2_NAME.description,
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[2]);
            fs.renameSync(
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_3_NAME.description,
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[3]);
            fs.renameSync(
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_4_NAME.description,
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[4]);
            fs.renameSync(
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_5_NAME.description,
                untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[5]);

                
            console.info('xcx ***** old:', untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + SysConstants.CONST_BAND_5_NAME.description)
            console.info('xcx ***** new:', untarPath + outputFolderPerUntared + '\\' +  outputFolderPerUntaredForTS2 + '\\' + titlesOfBandsAsGeoTIFFForTS2[5])
        })

объяснил выше в вопросе

вам нужно будет использовать асинхронную функцию, чтобы дождаться завершения вашей первой функции, в вашем случае удалите setTimeOut, затем создайте отдельную функцию, которая принимает каждый элемент, поступающий из устройства чтения fs, и передает его в созданную вами асинхронную функцию, а затем я буду ждать каждого изменения, прежде чем продолжить...

Johan 14.06.2024 15:53

@Йохан, спасибо за ваш комментарий, однако я решил его по-другому, опубликую ответ позже. еще раз спасибо

Amr 14.06.2024 16:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил это, используя const tar = require('tar'); lib, как показано ниже в коде.

код:

 tar.x({
    file: pathToTarFileTobeExtracted,
    cwd: untarPath + outputFolderPerUntared + '\\' + outputFolderPerUntaredForTS2,
    sync: false,
})

Другие вопросы по теме