返回其他回调后调用回调函数的优雅方法

时间:2012-12-17 16:57:09

标签: javascript node.js callback

我在nodejs应用程序中有以下代码:

function someFileOperation(callback) {
    var files = ...;
    files.forEach(function (file) {
        doSomethingAsync(file, function (err, result) {

        });
    });
}

如果所有doSomethingAsync()调用它们的回调函数并且只调用一次doSomethingAsync()时发生错误,那么调用someFileOperation()的回调是多么优雅的方式?

现在我想出了类似的东西:

function someFileOperation(callback) {
    var files = ...;
    var noFiles = files.length;
    files.forEach(function (file) {
        doSomethingAsync(file, function (err, result) {
            if (err) {
                callback(err);
                callback = function () {}; // I don't want it to be called again
            } else if (--noFiles <= 0) {
                callback(null, true);
            }
        });
    });
}

但我认为这对于这么简单的任务来说是一个很大的开销。所以我正在寻找一种更优雅的方式,或者为这类问题寻找一个小框架

1 个答案:

答案 0 :(得分:3)

使用async.map或async.foreach,请参阅此处:https://github.com/caolan/async#maphttps://github.com/caolan/async#forEach

async.map方法接受一个项目数组,并对数组中的每个项目执行相同的异步调用。如果没有遇到错误,它将使用新的结果数组调用回调函数。