最后使用回调异步不会被调用 [英] Last callback not being called using async

查看:164
本文介绍了最后使用回调异步不会被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎无法得到最后的回调(评论为可选的回调),打电话将结果发送回浏览器。任何指针,以什么我做错了吗?我使用以下模块:异步,的RESTify和PostgreSQL为node.js的

 的console.log('开始');VAR异步=要求('异步');
VAR的RESTify =要求('的RESTify');
VAR服务器= restify.createServer();
server.use(restify.bodyParser());server.get('/用户/ creationdate /:用户名',函数(REQ,资源,下一个){
    VAR的userName = req.params.username;
    VAR记录;    async.parallel([
        函数(回调){
            getUserByName(用户名,函数(ERR,用户){
                如果(ERR)返回回调(ERR);
                记录=用户;
            });
        }
    ]
//可选的回调
        功能(错误){
            的console.log('5以下记录已被检索:'+记录);
            res.send(记录);
        });    下一个();
});server.listen(8080,函数(){
    的console.log('%s的在听%s'的,server.name,server.url);
});的HandleError =功能的HandleError(ERR){
    如果(ERR!){返回false; }
    其他{
        ('出现以下错误:+ ERR)的console.log;    }
    返回true;
};功能getPgClient(){
    VAR PG =要求(PG);    VAR的客户=新pg.Client({
        用户:Postgres的,
        密码:'密码',
        数据库:'foobar的',
        主持人:192.168.1.100,
        端口:5432
    });    client.on('漏极',client.end.bind(客户端)); //断开连接客户端时,所有查询都完成    返回客户端;
}功能getUserByName(用户名,回调){
    变种客户= getPgClient();
    的console.log('2试图连接到数据库');    client.connect(功能(错误){
        的console.log('。3错误连接到数据库:'+的HandleError(ERR));
        如果(的HandleError(ERR))返回回调(ERR);        client.query(SELECT created_at用户的其中username ='+使用者名称+',功能(错了,结果){
            如果(的HandleError(ERR))回报;
            的console.log('4出现错误:+ ERR);
            的console.log(结果);
            的console.log(回调);
            回调(NULL,结果);
        })
    });
}


解决方案

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

  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);
});

这篇关于最后使用回调异步不会被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆