Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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
对于node.js中的循环和异步回调?_Node.js_Asynccallback - Fatal编程技术网

对于node.js中的循环和异步回调?

对于node.js中的循环和异步回调?,node.js,asynccallback,Node.js,Asynccallback,我不熟悉JavaScript和node.js。我想循环遍历一个目录,并将所有文件stat(而不是其他目录)添加到一个数组中。正如您在下面看到的,我的代码有一个问题,因为可能会在for循环完成后调用回调,所以在回调方法中使用“i”变量将不起作用。但是,代码应该是什么样子的,这样下面的代码片段才能正常工作呢?这和闭包有关吗 谢谢你的帮助 fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = [];

我不熟悉JavaScript和node.js。我想循环遍历一个目录,并将所有文件stat(而不是其他目录)添加到一个数组中。正如您在下面看到的,我的代码有一个问题,因为可能会在for循环完成后调用回调,所以在回调方法中使用“i”变量将不起作用。但是,代码应该是什么样子的,这样下面的代码片段才能正常工作呢?这和闭包有关吗

谢谢你的帮助

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