1

json構造をグローバル変数に読み込もうとしていますが、機能しないようです。ファイルから読み取られた後の処理にコールバックを使用しています(その部分は機能しています)。

「source_files」を入力したいのですが。

var fs = require('fs');
var source_files = [];

function readConfig(callback) { 
    fs.readFile('data.json', 'utf-8', function (err, content) {
        if (err) return callback(err);
        callback(content);
    });             
}                       

readConfig(function(config) { 
    var settings = JSON.parse(config);
    var inputs = settings.inputs;

    for (var id=0; id < inputs.length; id++) {
        source_files.push(inputs[id].replace('./',''));
    }           
});

console.log(source_files);
4

2 に答える 2

5

readFileこれは非同期であることを忘れないでください。最後の行、は、コールバックが呼び出される前、つまりコールバックが呼び出されるconsole.log(source_files)に実行されます。それをコールバックに移動する必要があります。readFilereadConfigreadConfig

コードをそのまま使用すると、次のようになります。

  1. 空白の配列を作成します。
  2. と呼びますreadConfig
  3. readConfigを呼び出しますreadFile
  4. readFile 非同期読み取り操作を開始して戻ります
  5. readConfig戻り値。
  6. source_files空のログを記録します。
  7. その後、readFile操作が終了し、コールバックが呼び出されます。コールバックを呼び出しreadConfigます。
  8. readConfigコールバックは設定されますがsource_files、何も観察されないため、その時点で森に落ちる木に少し似ています。:-)
于 2012-07-07T14:18:37.217 に答える
2

すでに述べたように、readFileは非同期です。これが起動初期化コードである場合(つまり、ブロックするかどうかは関係ありません)、readFileSync代わりに使用できます(スローerrまたはリターンcontent)。

ただし、readConfig後の入力(POSIX信号やTCP要求など)に応答して呼び出すこともできる場合は、非同期に保つか、他のI/Oをブロックするリスクを冒す必要があります。

于 2012-07-07T15:51:38.707 に答える