全球范围不起作用?

时间:2013-03-13 23:02:20

标签: javascript node.js

我目前正在尝试将特定文件夹中每个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);

2 个答案:

答案 0 :(得分:1)

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

var article = "";

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

global.article = article;

如果由于某种原因你想直接更新global.article,你可以改为更新global.article,如这个JSFiddle所示:

http://jsfiddle.net/Lkpe4/

HTH

答案 1 :(得分: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);
        }
   });
}