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”仍然为空,尽管当我在“log = process_parsedLog(logs);”之后使用 console.log(log) 检查它时 给出正确的结果。

4

2 回答 2

1

问题是 fs.readFile 是一个异步函数,并且 process_logs 函数在 readFile 调用您传递给它的回调之前完成了它的执行。您应该在这些情况下使用承诺: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 回答