javascript - 使用回调函数更新 JSON 对象

标签 javascript json node.js asynchronous

所以我有一个 db_functions.js 文件,其中包含一些与数据库交互的函数。这是其中的一部分:

function getUsers(client, fn){
    //var directors = {};
    client.keys('*', function(err, keys){
        keys.forEach(function(key){
            client.hgetall(key, function(err, vals){
            fn(key, vals);
        });
        });
    });

我在另一个文件中使用 getUsers 函数:

router.get('/accounts', function(req, res){
    var dir = {};
    db_functions.getUsers(client, function(key, vals, cb){
        dir[key] = vals;
        cb(dir);

        function cb(f){
            var final_dir = {};

            console.log(f)
            res.json(f);
        }
    }

    )});

我尝试使用回调从数据库获取一些信息,使用该信息更新 JSON 对象,当我使用所有信息更新该对象时,发送 JSON 对象作为响应。

问题出在 cb 函数中,res.json 被多次调用,这给出了“发送后无法设置 header ”错误。 res.json 仅应在 dir 更新完成后调用

最佳答案

res.json should only be called once dir is done updating

为什么不在收集完所有数据后才调用 getUsers 回调?

function getUsers(client, fn){
    client.keys('*', function(err, keys) {
        var values = {};
        var remainingRequests = keys.length;
        keys.forEach(function(key) {
            // Note that this will run keys.length requests in parallel
            // forEach does not (and cannot) wait for the async calls to finish
            client.hgetall(key, function(err, vals){
                remainingRequests -= 1;
                if (!err) {
                    values[key] = vals;
                }
                if (remainingRequests === 0) {
                    fn(values);
                }
            });
        });
    });
}

outer.get('/accounts', function(req, res){
    db_functions.getUsers(client, function(values){
        res.json(values);
    });
});

关于javascript - 使用回调函数更新 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039673/

相关文章:

javascript - 查找 DOM 节点索引

javascript - 我如何转换 d3 force 指令图以与 angularjs 一起使用?

javascript - 了解如何将 Redis 与 Node.js 和服务器发送事件一起使用

javascript - 红帽 OpenShift : cannot build/deploy node app because "Output image could not be resolved"

javascript - 是否可以将 ES5 JavaScript 与 Angular 2 而不是 TypeScript 一起使用?

javascript - 动态创建 ChartJS

asp.net - 检查分散在同一页面上的复选框

javascript - d3 json加载错误未捕获类型错误: Cannot read property 'length' of undefined

javascript - 从 Node.js 服务器接收 JSON 对象

javascript - 在整个 mocha 测试之前运行异步代码