节点轮询器未正确退出

时间:2014-10-17 14:50:42

标签: javascript node.js q

我有一个函数,它将在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退出?有没有更好的方法来实现这一目标?

1 个答案:

答案 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()以确保您正确使用它,因为在某些情况下它表示不应该调用它(尽管如果您完成了所有活动,它们可能不适用)。