JavaScript 仅显示包含 promise 对象的 for 循环的最后一次迭代的输出



我编写了一个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 = 

你应该没事。

最新更新