1

我正试图围绕 bluebird Promises,并通过文档中的一些示例。我当前的代码基于此示例

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)

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

4

1 回答 1

3

经过一番调查,蓝鸟示例代码似乎被破坏了。正确的代码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 函数将其作为其第一个参数接收(尽管在示例中将其忽略)。

于 2014-11-05T14:17:52.443 回答