我觉得这是一个非常基本的错误,但我花了几天时间阅读有关JavaScript范围的文章/书籍,回到这个问题,仍然没有真正达到任何清晰度,更不用说工作了解决方案 - 所以是时候把自己放在你的怜悯之上了。当然,我已经查看了其他问题/答案,但它们似乎指的是不同类型的范围问题,或者至少研究它们并没有让我更接近解决方案,所以我虽然冒险要求自己。
此函数应该采用文件名列表,然后遍历列表检索文件本身并将内容传递给另一个函数,该函数本身返回表示文件内容的javascript对象。正如评论中所指出的,这个方法本身是有效的 - 当在循环中创建articles [i]时,articles [i] .body包含它应该的数据。但是,到循环结束时,不知何故,数组再次为空。有谁能告诉我我做错了什么?
// Returns an array of processed article objects
function processAllArticles(dirname, res) {
fs.readdir(dirname, function(err, filenames) {
if (err) {
onError(err);
return;
}
var articles = []; // I think this is in the wrong scope?
// Array.foreach is 95% slower than a regular for loop apparently
for (var i = 0, len = filenames.length; i < len; i++) {
//console.log(filenames[i]); // This part seems to work
var currentFilePath = dirname + '/' + filenames[i];
//console.log("Trying to pass in " + currentFilePath);
fs.readFile(currentFilePath, function(err, content) {
articles[i] = processArticle(content)
// The article object seems to exist in here
// console.log(articles[i].body);
});
console.log("Articles array after iteration = " + articles); //Empty
console.log("Articles["+ i + "] = " + articles[i]); // Undefined.
} // end loop
console.log("ready to render " + articles.length + " article objects.");
// articles is empty at this point ugh so nothing is being rendered
res.render('index', { articles: articles });
});
}