Node.js流控制

时间:2013-02-28 11:39:14

标签: node.js

我的问题如下: 我想返回回调返回的结果。

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)检查它给出正确的结果。

2 个答案:

答案 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来避免回调函数的金字塔。