2014-11-05 66 views
1

我试图围绕蓝鸟承诺包裹我的头,并通过文档中的一些示例。我当前的代码是基于this example:不出所料为什么蓝鸟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) 

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

回答

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对象,处置功能接收作为第一个参数(尽管在本例中忽略)上被调用。