【问题标题】:Why does this bluebird pg code hang?为什么这个蓝鸟 pg 代码会挂起?
【发布时间】:2014-11-05 23:34:26
【问题描述】:

我正试图围绕 bluebird 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)

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

【问题讨论】:

    标签: node.js bluebird node-postgres


    【解决方案1】:

    经过一番调查,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 对象上调用,disposer 函数将其作为其第一个参数接收(尽管在示例中它被忽略了)。

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2018-01-31
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多