javascript仅显示带有promise对象的for循环的最后一次迭代的输出
我编写了一个javascript仅显示带有promise对象的for循环的最后一次迭代的输出,javascript,node.js,Javascript,Node.js,我编写了一个node.js脚本,用于从一个目录中获取所有图像文件(我将其作为输入),对其运行一些操作,然后将它们保存在目标目录中(另一个输入),作为filename.suffix.extension。我把后缀也作为输入 但我只看到了我收集的列表中的最后一个文件,该文件将显示在目标目录中。 // imports var Jimp = require('jimp'); const fs = require('fs') // inputs dir = process.argv[2] target =
node.js
脚本,用于从一个目录中获取所有图像文件(我将其作为输入),对其运行一些操作,然后将它们保存在目标目录中(另一个输入),作为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运行整个程序
从问题中跟进,我尝试过的事情:
但仍然几乎不起作用
立即调用函数表达式
结果:
仍然只有最后一个文件被写入
Function.prototype.bind
我发现这是一个承诺对象
forEach实现
仍然只打印了最后一次迭代
有人能帮我吗?问题是,
target\u文件
在每个文件中都是一个共享变量(每个迭代都在修改相同的变量)。只要改变一下:
target_file =
到
或
您应该会没事。问题在于,
target\u文件
在每一个文件中都是一个共享变量(每个迭代都在修改相同的变量)。只要改变一下:
target_file =
到
或
你应该很好。总是声明变量<代码>常量目标文件…@JonasW。你能告诉我这对我的案子有什么影响吗?因为我正在写入每个迭代方式中的文件声明变量<代码>常量目标文件…@JonasW。你能告诉我这对我的案子有什么影响吗?因为我在每次迭代中都会写入文件,所以我对js是新手,感谢您的快速回复。我认为
target\u file
是一个局部变量,在每个函数调用中构造和销毁。您是否可以回答,即使target\u file
是一个共享变量,我也在每个迭代中编写文件。似乎编写部分发生在迭代完成之后当您执行Jimp.read(dir+'/'+files[file])、函数(err,filee){/*do stuff*/})
时,/*do stuff*/
部分是一个回调,这意味着它将异步发生。在函数运行时,很可能循环的每个迭代都已完成(然后每个文件调用一次回调,但它们都写入同一个目标文件,因此似乎只调用了其中一个)。我对js不熟悉,感谢您的快速回复。我认为target\u file
是一个局部变量,在每个函数调用中构造和销毁。您是否可以回答,即使target\u file
是一个共享变量,我也在每个迭代中编写文件。似乎编写部分发生在迭代完成之后当您执行Jimp.read(dir+'/'+files[file])、函数(err,filee){/*do stuff*/})
时,/*do stuff*/
部分是一个回调,这意味着它将异步发生。在函数运行时,很可能循环的每个迭代都已完成(然后对每个文件调用一次回调,但它们都写入同一个目标文件,因此似乎只调用了其中一个)。
funcs[j]();
^
TypeError: funcs[j] is not a function
target_file =
let target_file =
const target_file =