且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

最后使用回调异步不会被调用

更新时间:2022-10-15 23:29:35

我不知道为什么你使用异步,因为你只呼叫一个异步函数。但回调不叫的原因是因为你没有通过调用其回调结束的第一个函数:

  async.parallel([
  函数(回调){
    getUserByName(用户名,函数(ERR,用户){
      //调用异步回调有犯错和用户
      回调(ERR,用户);
    });
  }
],功能(ERR,记录){
  的console.log('5以下记录已被检索:'+记录);
  res.send(记录);
});

或者更短:

  async.parallel([
  函数(回调){
    getUserByName(回调);
  }
],功能(ERR,记录){
  的console.log('5以下记录已被检索:'+记录);
  res.send(记录);
});

或者,在这种情况下,更短(与无需异步):

  getUserByName(函数(ERR,记录){
  //处理错误,还是......
  的console.log('5以下记录已被检索:'+记录);
  res.send(记录);
});

I cannot seem to get the last callback (commented as "optional callback") called to send the result back to the browser. Any pointers as to what I am doing wrong? I am using the following modules: async, restify and postgresql for node.js

console.log('Start');

var async = require('async');
var restify = require('restify');
var server = restify.createServer();
server.use(restify.bodyParser());

server.get('/user/creationdate/:username', function(req, res, next) {
    var userName = req.params.username;
    var record;

    async.parallel([
        function(callback){
            getUserByName(userName, function(err, user) {
                if (err) return callback(err);
                record = user;
            });
        }
    ],
// optional callback
        function(err){
            console.log('5. Following record has been retrieved:' + record);
            res.send(record);
        });

    next();
});

server.listen(8080, function () {
    console.log('%s listening at %s', server.name, server.url);
});

handleError = function handleError(err) {
    if(!err) { return false; }
    else {
        console.log('The following error occurred:' + err);

    }
    return true;
};

function getPgClient(){
    var pg = require('pg');

    var client = new pg.Client({
        user: 'postgres',
        password: 'password',
        database: 'foobar',
        host: '192.168.1.100',
        port: 5432
    });

    client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished

    return client;
}

function getUserByName(userName, callback){
    var client = getPgClient();
    console.log('2. Trying to connect to DB');

    client.connect(function(err) {
        console.log('3. Error connecting to DB:' + handleError(err));
        if(handleError(err)) return callback(err);

        client.query("SELECT created_at FROM users WHERE username='" + userName + "'", function(err, result) {
            if(handleError(err)) return;
            console.log('4. Error occurred:' + err);
            console.log(result);
            console.log(callback);
            callback(null, result);
        })
    });
}

I'm not sure why you're using async since you're only calling one asynchronous function. But the reason your callback isn't called is because you're not ending the first function by calling its callback:

async.parallel([
  function(callback) {
    getUserByName(userName, function(err, user) {
      // call async callback with err and user
      callback(err, user);
    });
  }
], function(err, record) {
  console.log('5. Following record has been retrieved:' + record);
  res.send(record);
});

Or, shorter:

async.parallel([
  function(callback) {
    getUserByName(callback);
  }
], function(err, record) {
  console.log('5. Following record has been retrieved:' + record);
  res.send(record);
});

Or, in this case, even shorter (and without the need for async):

getUserByName(function(err, record) {
  // handle error, or ...
  console.log('5. Following record has been retrieved:' + record);
  res.send(record);
});