我编写了一个node.js
脚本来使用 jimp 从一个目录中获取所有图像文件(我将其作为输入(,对其运行一些操作,然后将它们作为filename.suffix.extension
保存在目标目录(另一个输入(中。我也接受后缀作为输入。
但是我只看到我收集的列表中的最后一个文件存在于目标目录中。
// imports
var Jimp = require('jimp');
const fs = require('fs')
// inputs
dir = process.argv[2]
target = process.argv[3]
suffix = process.argv[4]
// collect files
let dirCont = fs.readdirSync( dir );
const files = dirCont.filter( ( elm ) => /.*.(png|jpg)/gi.test(elm) );
// run jimp on each file and write to target directory
for (file in files)
{
target_file = target+files[file].replace(/.[^/.]+$/, "")+'.'+suffix+files[file].match(/.[^/.]+$/)
Jimp.read(dir+'/'+files[file]).then(function (file) {
return file.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(target_file); // save
})
}
我用咕噜声运行整个事情。
从这个问题开始,我尝试过的事情:
但仍然几乎不起作用
立即调用的函数表达式
var Jimp = require('jimp');
const fs = require('fs')
dir = process.argv[2]
target = process.argv[3]
suffix = process.argv[4]
let dirCont = fs.readdirSync( dir );
const files = dirCont.filter( ( elm ) => /.*.(png|jpg)/gi.test(elm) );
for (file in files)
{
(function(index) {
console.log("index: "+index)
target_file = target+files[index].replace(/.[^/.]+$/, "")+'.'+suffix+files[index].match(/.[^/.]+$/)
Jimp.read(dir+'/'+files[index]), function (err, filee) {
if (err) throw err;
filee.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(target_file); // save
}
})(file);
}
结果:
仍然只写入最后一个文件
Function.prototype.bind
var Jimp = require('jimp');
const fs = require('fs')
dir = process.argv[2]
target = process.argv[3]
suffix = process.argv[4]
let dirCont = fs.readdirSync( dir );
const files = dirCont.filter( ( elm ) => /.*.(png|jpg)/gi.test(elm) );
var funcs = {}
for (file in files)
{
console.log(file)
console.log(files[file])
target_file = target+files[file].replace(/.[^/.]+$/, "")+'.'+suffix+files[file].match(/.[^/.]+$/)
funcs[file] = Jimp.read(dir+'/'+files[file]), function (err, filee) {
return filee.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(target_file); // save
}.bind(this, file)
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
结果:
错误信息:
funcs[j]();
^
TypeError: funcs[j] is not a function
我发现它是一个承诺对象
对于每个实现
仍然只打印了最后一次迭代
谁能帮我解决这个问题?
问题是target_file
,在每一个中,都是一个共享变量(每次迭代都在修改同一个变量(。 只需更改:
target_file =
自
let target_file =
或
const target_file =
你应该没事。