为什么要接收空数组?

时间:2013-12-26 11:43:03

标签: node.js variables scope

伙计们我是节点js的初学者... 为什么在我的forEach结束时我的“过滤”数组是空的?以及如何解决这个问题? 这是我的代码

var fs = require('fs');
module.exports.listByType = function(dirname, filter, callback) {
    try {
        var filtered = [];
        fs.readdir(dirname, function(e, list) {
            list.forEach(function(f) {
                if (f.split('.').pop() === filter) {
                    filtered.push(f);
                }
            });
        });
        callback(null,filtered);
    } catch (e) {
        callback(e);
    }
};

1 个答案:

答案 0 :(得分:1)

由于readdir 异步,因此调用回调的代码会在数组填充之前发生。如果接收代码立即使用该数组,则它将为空。 (如果该代码等待其他异步而不是立即使用数组,结果将是混乱的,在接收代码使用它时,数组可能有也可能没有。)

您想将您的电话转移到里面的回调 readdir回调:

var fs = require('fs');
module.exports.listByType = function(dirname, filter, callback) {
    try {
        var filtered = [];
        fs.readdir(dirname, function(e, list) {
            list.forEach(function(f) {
                if (f.split('.').pop() === filter) {
                    filtered.push(f);
                }
            });
            callback(null,filtered); // <=== Moved this line
        });
    } catch (e) {
        callback(e);
    }
};

您还可以将filtered变量移动到回调中:

var fs = require('fs');
module.exports.listByType = function(dirname, filter, callback) {
    try {
        fs.readdir(dirname, function(e, list) {
            var filtered = [];      // <=== Also moved this line
            list.forEach(function(f) {
                if (f.split('.').pop() === filter) {
                    filtered.push(f);
                }
            });
            callback(null,filtered); // <=== Moved this line
        });
    } catch (e) {
        callback(e);
    }
};