Для приведенного ниже кода в разделе 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])
})
объяснил выше в вопросе
@Йохан, спасибо за ваш комментарий, однако я решил его по-другому, опубликую ответ позже. еще раз спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я решил это, используя const tar = require('tar'); lib, как показано ниже в коде.
код:
tar.x({
file: pathToTarFileTobeExtracted,
cwd: untarPath + outputFolderPerUntared + '\\' + outputFolderPerUntaredForTS2,
sync: false,
})
вам нужно будет использовать асинхронную функцию, чтобы дождаться завершения вашей первой функции, в вашем случае удалите setTimeOut, затем создайте отдельную функцию, которая принимает каждый элемент, поступающий из устройства чтения fs, и передает его в созданную вами асинхронную функцию, а затем я буду ждать каждого изменения, прежде чем продолжить...