为什么这个bluebird pg代码挂起?

时间:2014-11-05 13:52:51

标签: node.js bluebird node-postgres

我正试图围绕蓝鸟Promises,并通过文档中的一些示例。我目前的代码基于this example

var Promise = require('bluebird');
var pg = Promise.promisifyAll(require('pg'));
var using = Promise.using;

function getConnection(string) {
    var close;
    return pg.connectAsync(string).spread(function(client, done) {
        close = done;
        return client;
    }).disposer(function() {
        console.log('In disposer');
        try {
            if (close) close();
        } catch(e) {};
    });
};

using(getConnection('/var/run/postgresql dc'), function(conn) {
    console.log('Got a connection');
    return conn.queryAsync('SELECT 1');
})
.then(function(rows) {
    console.log('Retrieved %s row(s)',rows.rowCount);
});

输出符合预期:

Got a connection
In disposer
Retrieved 1 row(s)

但是,程序永远不会终止。什么是挂断(双关语)?

1 个答案:

答案 0 :(得分:3)

经过一番调查,看来bluebird示例代码已损坏。 getConnection()的正确代码应为:

function getConnection(string) {
    var close;
    return pg.connectAsync(string).spread(function(client, done) {
        close = done;
        return client;
    }).disposer(function(client) {
        console.log('In disposer');
        try {
            if (close) close(client);
        } catch(e) {};
    });
};

具体来说,必须在done()对象上调用client,处理函数接收该对象作为其第一个参数(尽管在示例中忽略它)。