2013-03-13 76 views
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); 

回答

1

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

var article = ""; 

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

global.article = article; 

如果由于某种原因,你要直接更新global.article,可以改为更新global.article,如在此的jsfiddle:

http://jsfiddle.net/Lkpe4/

HTH

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); 
     } 
    }); 
}