Nodejs异步调用在完成之前调用drain回调

时间:2017-01-12 20:58:55

标签: node.js asynchronous

我有一个nodejs应用程序,运行大约40个oracle连接/查询。我使用异步来限制来自proposed solution here的异步调用。我的问题是在我的函数/查询完成之前,排水回调正在运行并完成。非常感谢任何帮助。

var queue = async.queue(runAsyncCallout, 5); 

        queue.concurrency = 5; 

        db.collection('callout').find({'active':0}).each(function(error, callout) {

             queue.push(callout);

        });

        queue.drain = function() {
            db.collection('callout_lock').update({'context': 'ALL_CALLOUTS'}, {$set: {'lock': '0'}});
            db.collection('callout_lock').update({'context': 'ALL_CALLOUTS'}, {$set: {'date': time_stamp}});
            console.log("All callouts done unlocking");
        };
        queue.concurrency = 5;


function runAsyncCallout(callout, callback) {

    switch(callout.db_connect){//Grab connection profiles

        case "A":
            connAttrs=A;
            break;
        case "B":
            connAttrs=B;
            break;
        case "C":
            connAttrs=C;
            break;
        default:
            connAttrs=D;
    }


    oracledb.getConnection(connAttrs, function (e, connection) {


            connection.execute(callout.query, {}, {
                outFormat: oracledb.OBJECT
            }, function (e, result) {

                //Sparing the details here, run oracle query and save to mongodb

                doRelease(connection);



            });


    });

callback();
}

1 个答案:

答案 0 :(得分:0)

我认为简短的回答是你最后的回调(从队列传递)是在错误的地方。在那个时候调用回调就像告诉队列一样,“嘿,完成那件事,下一个!”

在您在Oracle中完成工作并释放连接之前,您还没有真正处理过“标注”。尝试在传递到connection.releaseconnection.close的回调中调用回调(无论您使用哪个)。

以下是其他一些提示/建议:

  1. 从一次性连接切换到连接池。该驱动程序现在支持internal pool cache中的多个命名池,因此它非常易于使用。
  2. 从多次往返切换到批量处理。当然,根据您使用JavaScript和PL / SQL的经验,这个很棘手,但如果您愿意,我可以提供一个示例。