2014-11-05 52 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對象,處置功能接收作爲第一個參數(儘管在本例中忽略)上被調用。