为什么这个蓝鸟PG代码挂起?

我试图围绕蓝鸟诺言包裹头,并通过文档中的一些例子。 我目前的代码是基于这个例子 :

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) 

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

经过一番调查,似乎蓝鸟例子的代码被破坏了。 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对象上调用,而dispose函数将其作为第一个参数接收(尽pipe在示例中它被忽略)。