为什么这个蓝鸟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在示例中它被忽略)。
- 蓝鸟Promisfy.each,for循环和if语句?
- Nodejs蓝鸟诺言在处理图像时失败
- 包含在可返回的生成器中的nodejs child_process.spawnSync或child_process.spawn返回输出
- 复杂的child_process不能与Promise蓝鸟一起工作
- 从asynchronous获取蓝鸟承诺等待function
- nodejs – 帮助“promisifying”使用嵌套promise读取的文件
- 在Nodejs中使用asynchronous等待redis和bluebird
- Sequelize JS / Bluebird:从asynchronous并行数据库调用开始
- function类似Promise.some /任何未知数量的承诺