gpt4 book ai didi

javascript 仅显示 for 循环的最后一次迭代的输出,其中包含 Promise 对象

转载 作者:行者123 更新时间:2023-12-01 01:53:40 25 4
gpt4 key购买 nike

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

}

我使用 grunt 运行整个过程。

跟进this问题,我尝试过的事情:

但仍然几乎不起作用

立即调用的函数表达式

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);

}

结果:

仍然只写入最后一个文件

函数.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

我发现它是一个 promise 对象

forEach 实现

仍然只打印最后一次迭代

谁能帮我解决这个问题吗?

最佳答案

问题在于,在每个文件中,target_file 都是一个共享变量(每次迭代都修改同一个变量)。只需更改:

target_file = 

let target_file = 

const target_file = 

你应该没问题。

关于javascript 仅显示 for 循环的最后一次迭代的输出,其中包含 Promise 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51217473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com