javascript - 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
png
我总是收到找不到新 jpg 文件的错误,因此尽管文件被转换为文件,但操作不起作用jpg
。当我再次运行相同的脚本时,现在所有文件都是jpeg
这次运行的文件操作。
编辑
正如@CertainPerformance 的答案之一所建议的那样,我更改了代码以在 then 块内完成我的大部分工作,但再次遇到相同的错误
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
});
}
注意:编辑中有一些变化,我正在删除jpg
文件而不是png
文件(我最初是这样做的)
解决方案
正如您所看到的.then
,pngToJpeg
是异步的 - 如果您想在 上进行工作dir+file_name_without_ext
,您必须先等待初始.then
和writeFileSync
解决。将依赖于异步操作的所有内容放在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)
避免不得不摆弄不重要的指标)
推荐阅读
- android - AsyncTask 类中的 startActivityForResult 和 onActivityResult
- git - Gogs 访问存储库文件以在挂钩中使用 lftp
- c# - 自动实现的属性是否使用私有构造函数进行初始化
- vue.js - 从 nuxtjs 中的外部 js 文件访问存储
- php - Autodesk Forge 上传导致 504 网关超时
- javascript - 如何使用 if 语句更改变量
- javascript - 用作回调的javascript对象/类方法未被调用但没有错误
- xamarin.forms - 系统引用有黄色三角形 Xamarin.Forms iOS
- android - FirebaseAuth.signInWithEmailAndPassword() 不适用于新的 firebase sdk 版本
- c# - 确定一棵树是否在线性时间内平衡