对于node.js中的循环和异步回调?
我不熟悉JavaScript和node.js。我想循环遍历一个目录,并将所有文件stat(而不是其他目录)添加到一个数组中。正如您在下面看到的,我的代码有一个问题,因为可能会在for循环完成后调用回调,所以在回调方法中使用“i”变量将不起作用。但是,代码应该是什么样子的,这样下面的代码片段才能正常工作呢?这和闭包有关吗 谢谢你的帮助对于node.js中的循环和异步回调?,node.js,asynccallback,Node.js,Asynccallback,我不熟悉JavaScript和node.js。我想循环遍历一个目录,并将所有文件stat(而不是其他目录)添加到一个数组中。正如您在下面看到的,我的代码有一个问题,因为可能会在for循环完成后调用回调,所以在回调方法中使用“i”变量将不起作用。但是,代码应该是什么样子的,这样下面的代码片段才能正常工作呢?这和闭包有关吗 谢谢你的帮助 fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = [];
fs.readdir(SYNCDIR, function(err1, files) {
var filesOnly = [];
if(!err1) {
for(var i = 0; i < files.length; i++) {
var imgFilePath = SYNCDIR + '/' + files[i];
fs.stat(imgFilePath, function(stat){
if (stat.isFile()){
filesOnly[i] = stat; // This will not be correct since the for-loop has finished
}
});
}
}
});
fs.readdir(SYNCDIR,函数(err1,文件){
var filesOnly=[];
如果(!err1){
对于(var i=0;i
关于需要使用闭包,您是对的。您应该将for
循环的内容包装在一个自调用函数中,以便为每次迭代保留i
的值
fs.readdir(SYNCDIR, function(err1, files) {
var filesOnly = [];
if(!err1) {
for(var i = 0; i < files.length; i++) {
(function(i) {
var imgFilePath = SYNCDIR + '/' + files[i];
fs.stat(imgFilePath, function(stat){
if (stat.isFile()){
filesOnly[i] = stat;
}
});
})(i);
}
}
});
fs.readdir(SYNCDIR,函数(err1,文件){
var filesOnly=[];
如果(!err1){
对于(var i=0;i
一种方法是重写循环的内部以使用闭包:
fs.readdir(SYNCDIR, function(err1, files) {
var filesOnly = [];
if(!err1) {
for(var i = 0; i < files.length; i++) {
(function(index) {
var imgFilePath = SYNCDIR + '/' + files[index];
fs.stat(imgFilePath, function(stat){
if (stat.isFile()){
filesOnly[index] = stat;
}
});
})(i);
}
}
});
或者使用新的threads模块(),然后您可以在threads子进程中使用标准的同步编码来完成所有这些工作,因为它们一次只处理一个用户的请求
再见异步逻辑和嵌套回调 +1表示
.forEach
方法。这要容易得多,并且避免了为每次迭代创建新的绑定范围。我认为,自从您发布此节点以来,它已经向fs namespace.related(如果不是重复的话)添加了一些同步函数:非常感谢。帮了大忙
fs.readdir(SYNCDIR, function(err1, files) {
var filesOnly = [];
if(!err1) {
files.forEach(function(file, i) {
var imgFilePath = SYNCDIR + '/' + file;
fs.stat(imgFilePath, function(stat){
if (stat.isFile()){
filesOnly[i] = stat;
}
});
});
}
});