我的问题如下: 我想返回回调返回的结果。
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”仍然为null,尽管我在“log = process_parsedLog(logs);”之后用console.log(log)检查它给出正确的结果。
答案 0 :(得分:1)
问题是fs.readFile是一个异步函数,process_logs函数在readFile调用你传递给它的回调之前完成它的执行。你应该在这些情况下使用promises: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;
};
答案 1 :(得分:0)
你必须在文件系统的回调函数中进行返回。但该函数保持异步。您不能立即使用返回值:
log = process_parsedLog(logs);
return log;
});
你应该让这些函数保持异步,如果你想拥有这样的模块,可以在你要导出的匿名函数中添加一个回调函数,例如:
exports.process_logs = function(file, process_func, process_parsedLog, callback)
当fs完成后,它将调用您通过return callback(err, log)
你也可以在这里使用promises来避免回调函数的金字塔。