【问题标题】:Why receiving an empty array?为什么接收一个空数组?
【发布时间】:2014-01-14 01:48:39
【问题描述】:

伙计们,我是 nodejs 的初学者...... 为什么在我的 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);
    }
};

【问题讨论】:

    标签: node.js variables scope


    【解决方案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);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 2010-09-13
      • 2012-08-26
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多