foreach对象和异步函数

时间:2014-12-01 17:21:16

标签: javascript node.js asynchronous express

我试图遍历对象并调用一个异步并具有回调的方法("搜索"),当它完成所有对象时,写入结果对象,即resultSet在json文件中;但现在问题是因为我的搜索功能是异步writefile不等待它们完成然后将结果集写入json文件,所以它将空对象写入json文件;值得一提的是,我不想使用承诺;除了承诺,你能告诉我什么是应对这个问题的最佳方法吗?

router.post('/export', function (req, res) {
    Object.keys(models).forEach(function (name) {
        resultSet[name] = [];
        search(param1, name, function (err, data) {
            if (err) {
                console.error(req.host, req.path, err, err.stack);
                res.json(400, err);
            } else {
                resultSet[name] = data;
            }
        });
    });

    var file = "myFile.json";

    jf.writeFile(file,resultSet,function(err){
        console.log(err);
    });      
});

1 个答案:

答案 0 :(得分:1)

改为:

function auxFunc(resultSet){
    var file = 'myFile.json';

    jf.writeFile(file, resultSet, function (err) {
        console.log(err);
    })
}

router.post('/export', function (req, res) {
    var keys = Object.keys(models);
    var counter = 1;
    keys.forEach(function (name) {
        resultSet[name] = []; 
        search(param1, name, function (err, data) {
            if (err) {
                console.error(req.host, req.path, err, err.stack);
                res.json(400, err);
            } else {
                resultSet[name] = data;
                if(counter++ === keys.length)
                   auxFunc(resultSet);
            }
        });
    });
});

这是一个控制流问题.. 循环中的回调会创建一个竞争条件,你有很多“进程”自行工作,所以使用计数器你会知道并检测所有进程何时完成,然后你激活你需要的函数。

在处理回调时,不一定要成为一个计数器,这取决于您可能需要处理信息的情况,并且根据触发动作的结果,这可以通过返回布尔值的函数来实现,所以回调的诀窍是总是某个地方的条件来控制流量。