伙计们我是节点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);
}
};
答案 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);
}
};