我正试图围绕蓝鸟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)
但是,程序永远不会终止。什么是挂断(双关语)?
答案 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
,处理函数接收该对象作为其第一个参数(尽管在示例中忽略它)。