Изменения в node.js, сделанные в файлах, не отражающих до второго запуска

Я конвертирую все .pngфайлы в .jpgфайлы в каталоге, а jpeg запускает некоторые манипуляции с ними, которые могут быть только для node.jsфайлов. Но , похоже, они не замечают преобразованные файлы и удаленные файлы png, пока я снова не запустил тот же скрипт. const fs = require('fs') const pngToJpeg = require('png-to-jpeg'); let dirrCont = fs.readdirSync( dir ); files = dirrCont.filter( ( elm ) => /.*.(png|jpg)/gi.test(elm) ); for (i in files) { let file = files[i] let file_name_without_ext = file.replace(/.[^/.]+$/, "") let extension = file.match(/.[^/.]+$/) if (extension[0] == '.png') { console.log('found') let buffer = fs.readFileSync(dir+file); pngToJpeg({quality: 100})(buffer) .then(output => fs.writeFileSync(dir+file_name_without_ext+'.jpg', output)); fs.unlinkSync(dir+file) extension = '.jpg' } let target_file = target + file_name_without_ext + '.' + suffix + extension // do some manipulations on dir+file_name_without_ext+extension

jpg

Я всегда получаю ошибку, что новые файлы jpeg не найдены, поэтому манипуляции не работают, хотя файлы преобразуются в файлы. Когда я запускаю тот же самый скрипт, с тех пор все файлы теперь управляются файлами.for (i in files) { let file = files[i] let file_name_without_ext = file.replace(/.[^/.]+$/, "") let extension = file.match(/.[^/.]+$/) if (extension[0] == '.png') { console.log('found') let buffer = fs.readFileSync(dir+file); pngToJpeg({quality: 100})(buffer) .then(output => { fs.writeFileSync(dir+file_name_without_ext+'.jpg', output); extension = '.jpg' // let target_file = target + file_name_without_ext + '.' + suffix + extension // Do some manipulations // I am done with the manipulations and I now want to delete // the jpg file I just created fs.unlinkSync(dir+file_name_without_ext+'.jpg') // Gives me back the same error }); } jpgpng

РЕДАКТИРОВАТЬ

как было предложено в одном из ответов @CertainPerformance, я изменил код, чтобы сделать большинство моих вещей внутри блока, но снова попал в ту же ошибку

.then

ПРИМЕЧАНИЕ. В редактировании есть немного изменений, и я удаляю jpgфайл вместо pngфайла (который я делал изначально)

javascript,node.js,

2

Ответов: 1


3

Как вы можете видеть pngToJpeg, dir+file_name_without_extасинхронно - если вы хотите продолжить работу .then, вам нужно дождаться начального writeFileSyncи thenпервого разрешения. Поместите все, что зависит от асинхронных операций внутри then. Например:

if (extension[0] == '.png') {
  console.log('found');
  const buffer = fs.readFileSync(dir + file);
  pngToJpeg({ quality: 100 })(buffer)
    .then(output => {
      fs.unlinkSync(dir + file);
      fs.writeFileSync(dir + file_name_without_ext + '.jpg', output);
      extension = '.jpg';
      const target_file = target + file_name_without_ext + '.' + suffix + extension;
      // do some manipulations on dir+file_name_without_ext+extension
    });
}

(Вы также должны позаботиться о том, чтобы неявно создавать глобальные переменные. Например, используйте for (const i in files)вместо этого или, возможно, for (const file of files)избегать необходимости возиться с несущественными признаками)

JavaScript, Node.js,
Похожие вопросы