为什么这个蓝鸟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在示例中它被忽略)。