1

我目前正在尝试将特定文件夹中每个 JSON 文件的数据添加到字符串,然后将该字符串记录到控制台 - 但它不起作用。有没有人能够阐明我哪里出错了?

global.article = "";
for(i=0;i<posts.length;i++){
  fs.readFile('posts/' + posts[i], 'utf8', function(err, json){
    var post = JSON.parse(json);
    article += "<article>";
    article += "<blockquote>";
    article += "<h3>" + post.title + "</h3>";
    article += "<small>" + post.date + "</small>";
    article += post.content;
    article += "</blockquote>";
    article += "</article>";
  });
}
console.log(article);
4

2 回答 2

1

您应该为文章声明一个新变量,而不是“global.article”。

var article = "";

如果您在循环中完成构造字符串后需要更新 global.article,您可以在循环退出时重新分配给它。

global.article = article;

如果出于某种原因您想直接更新 global.article,则可以改为更新 global.article,如此 JSFiddle 所示:

http://jsfiddle.net/Lkpe4/

高温高压

于 2013-03-13T23:25:34.173 回答
1

fs.readFile是异步的,所以console.log(article);底部的将在您的任何fs.readFile回调之前运行,并使用填充的 JSON 处理article

看看使用该async库提供异步流控制,但一个简单的解决方案说明了问题的本质是跟踪回调计数,并且仅article在它们全部完成后处理:

global.article = "";
var count = 0;
for(i=0;i<posts.length;i++){
    fs.readFile('posts/' + posts[i], 'utf8', function(err, json){
        var post = JSON.parse(json);
        article += "<article>";
        article += "<blockquote>";
        article += "<h3>" + post.title + "</h3>";
        article += "<small>" + post.date + "</small>";
        article += post.content;
        article += "</blockquote>";
        article += "</article>";
        if (++count === posts.length) {
            // All callbacks are now complete.
            console.log(article);
        }
   });
}
于 2013-03-14T01:33:38.930 回答