2013-03-13 100 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); 
     } 
    }); 
}