【问题标题】:foreach object and async function [duplicate]foreach 对象和异步函数
【发布时间】:2014-12-01 17:21:16
【问题描述】:

我正在尝试遍历对象并调用一个异步方法(“搜索”),该方法具有回调,当所有对象都完成后,将结果对象(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);
    });      
});

【问题讨论】:

  • 能不能把搜索功能改成把整组数据都拿进来,在搜索功能里面做循环?然后给它一个回调,函数完成后写入resultSet。
  • 不,它在许多其他地方都使用过!
  • Promise 确实是最好的解决方案。为什么不想使用这种方法?
  • 您可以创建一个计数器并在计数器显示时触发 writeFile..
  • 您是否尝试过使用async 库来更好地管理此扇出? async.map 作为异步 forEach 等效项做得很好。

标签: javascript node.js asynchronous express


【解决方案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);
            }
        });
    });
});

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

在处理回调时不必一直是计数器,具体取决于您可能需要处理信息的情况以及触发操作的结果,这可以通过返回布尔值的函数来实现,所以回调的诀窍是在某处总是有一个条件来控制流程。

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多