我有一个函数,它将在x秒内轮询数据库。我正在使用Q库,因此该函数将返回一个promise。该函数将在.then()s。
的长链中使用该函数确实给出了我期望的结果,但函数在返回结果后继续运行30-40秒。我无法弄清楚为什么在我回来后它不会立即退出。
var _ = require('lodash');
var pg = require('pg');
var Q = require('q');
connString = 'postgres://somedb_info';
var query = "SELECT * FROM job where jobid='somejobid123123'";
exports.run_poller = function () {
var deferred = Q.defer();
function exec_query(callback) {
pg.connect(connString, function(err, client, done) {
if(err) {
deferred.reject(err);
}
client.query(query, function(err, result) {
done();
if(err) {
return deferred.reject(err);
}
callback(result.rows[0]);
});
});
}
function wait_for(res){
if(res.status == 'COMPLETE') {
return deferred.resolve(res);
} else {
setTimeout(function(){
exec_query(wait_for);
}, 1000);
}
}
exec_query(wait_for);
return deferred.promise;
};
为了测试这个,我从main.js文件中调用函数,如下所示:
var poller = require('./utils/poller').run_poller;
poller().then(console.log).catch(function(err) {console.log(err,'*');});
为什么在返回数据后没有main.js退出?有没有更好的方法来实现这一目标?
答案 0 :(得分:0)
我看到pg维护了一个连接池。我会假设需要花一些时间来计算一些共享资源,或者只需要一段时间就可以关闭。
如果您知道自己完成了所有工作,则可以在节点应用中调用process.exit(0)
以强制它尽快退出。
或者,您可以找到影响连接池工作方式的配置设置。
在this doc page上,有一个这样的示例可能会有所帮助:
//disconnect client when all queries are finished
client.on('drain', client.end.bind(client));
您应该阅读doc for .end()
以确保您正确使用它,因为在某些情况下它表示不应该调用它(尽管如果您完成了所有活动,它们可能不适用)。