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

fs.readFileは非同期であるため、一番下の は、データを取り込む JSON 処理でコールバックconsole.log(article);の前に実行されます。fs.readFilearticle

ライブラリを使用して非同期フロー制御を提供する方法を見てみましょう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 に答える
1

「global.article」の代わりに、記事の新しい変数を宣言する必要があります。

var article = "";

ループ内の文字列の構築が完了したときに global.article を更新する必要がある場合は、ループが終了したときにそれに割り当てることができます。

global.article = article;

何らかの理由で global.article を直接更新したい場合は、次の JSFiddle に示すように、代わりに global.article を更新できます。

http://jsfiddle.net/Lkpe4/

HTH

于 2013-03-13T23:25:34.173 に答える