For-loop and async callback in node.js?

后端 未结 3 1321
猫巷女王i
猫巷女王i 2020-12-05 02:49

I\'m new to JavaScript and to node.js. I want to loop through a directory and add all file stat (not other directories) to an array. As you see below there is a problem with

相关标签:
3条回答
  • 2020-12-05 03:29

    Alternatively use the new threads module ( https://github.com/robtweed/Q-Oper8 ) and then you can do all this stuff much more simply using standard synchronous coding within the threads child processes, since they only deal with one user's request at a time.

    Goodbye to async logic and nested callbacks!

    0 讨论(0)
  • 2020-12-05 03:35

    One way is to rewrite the innards of the loop to use a closure:

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

    A better looking example, achieving the same, using Array.prototype.forEach:

    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;
                    }
                });
            });
        }
    });
    
    0 讨论(0)
  • 2020-12-05 03:37

    You are right about needing to use a closure. You should wrap the contents of the for loop in a self-invoking function to preserve the value of i for each iteration.

    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);
    
            }
        }
    });
    
    0 讨论(0)
提交回复
热议问题