使用回调函数更新JSON对象

Using callback functions to update a JSON object

本文关键字:JSON 对象 更新 函数 回调      更新时间:2023-09-26

所以我有一个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被多次调用,这会出现"发送后无法设置标头"错误。res.json只应在dir完成更新后调用

res.json只应在dir完成更新后调用

为什么不在收集完所有数据后才调用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);
    });
});

你指的是AJAX回调方法吗?类似:

  var jqxhr = $.get( "example.php", function(return_data) {
    console.log( return_data );
  })
  .done(function() {
    console.log( return_data );
  })
  .fail(function() {
    console.log( return_data );
  })
  .always(function() {
    console.log( return_data );
  });