0

私の質問は次のとおりです。コールバックによって返された結果を返したいです。

exports.process_logs = function(file, process_func, process_parsedLog) {
var logs = [];
var log = null;
var counter = 0;
fs.readFile(file, 'utf8', function(read_error, content) {
    if (read_error) return sys.error(read_error);

    // TODO:: Remove these hardcode rails filters
    // switch filters and split functions to a nested helper in process func
    content.split(/Processing /).forEach(function(msg, index) {
        if ((tmp = process_func(msg, index)))
            logs.push(tmp);
    });
    log = process_parsedLog(logs);
});
console.log(log);
return log;

};

しかし、「log = process_parsedLog(logs);」の直後に console.log(log) で確認すると、変数「log」はまだ null です。正しい結果が得られます。

4

2 に答える 2

1

問題は、fs.readFileが非同期関数であり、readFileが渡されたコールバックを呼び出す前にprocess_logs関数が実行を終了することです。これらの状況ではpromiseを使用する必要があります:https ://github.com/kriskowal/q

exports.process_logs = function(file, process_func, process_parsedLog) {
    var deferred = Q.defer();
    var logs = [];
    var log = null;
    var counter = 0;
    fs.readFile(file, 'utf8', function(read_error, content) {
        if (read_error) deferred.reject(sys.error(read_error));

        // TODO:: Remove these hardcode rails filters
        // switch filters and split functions to a nested helper in process func
        content.split(/Processing /).forEach(function(msg, index) {
        if ((tmp = process_func(msg, index)))
            logs.push(tmp);
        });
        log = process_parsedLog(logs);
        deferred.resolve(log);
    });
    // the result is not available yet
    return deferred.promise;
};
于 2013-02-28T11:45:53.470 に答える
0

ファイルシステムのコールバック関数でリターンを実行する必要があります。ただし、関数は非同期のままです。戻り値をすぐに使用することはできません。

log = process_parsedLog(logs);
return log;
});

関数を非同期に保つ必要があります。このようなモジュールが必要な場合は、エクスポートする無名関数に次のようにコールバック関数を追加します。

exports.process_logs = function(file, process_func, process_parsedLog, callback)

fsが完了すると、渡されたコールバックが呼び出されますreturn callback(err, log)

ここでもpromiseを使用して、コールバック関数のピラミッドを回避できます。

于 2013-02-28T11:44:35.543 に答える