Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript仅显示带有promise对象的for循环的最后一次迭代的输出_Javascript_Node.js - Fatal编程技术网

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 =