Node.js流控制

Node.js流控制,node.js,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);

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

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

您必须在文件系统的回调函数中进行返回。但函数保持异步。您不能立即使用返回值:

log = process_parsedLog(logs);
return log;
});
您应该使函数保持异步,如果您希望有这样的模块,请向您想要导出的匿名函数添加回调函数,如:

exports.process\u logs=函数(文件、process\u func、process\u parsedLog、回调)

当fs完成时,它将调用您通过
返回callback(err,log)


您也可以在这里使用承诺来避免回调函数金字塔。

问题在于fs.readFile是一个异步函数,并且process\u logs函数在readFile调用您传递给它的回调之前完成其执行。您应该在以下情况下使用承诺:


你不必使用承诺。您可以坚持使用普通回调,并使用其他技术来避免回调,比如命名回调函数或使用异步函数library@AndyD是的,你说得对。但是当您使用它们时(特别是当您有序列或必须等待多个异步操作完成时),它会更容易。根据我的经验,异步模块很好地解决了这个问题。看看这里的一个例子:@DanielUzunu我使用了像你提到的承诺,但是返回值不是我期望的,而是我得到了{promiseDispatch:[Function],valueOf:[Function]}你使用进程日志(…)得到数据;
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;
};