Javascript 完成嵌套数据库查询后进行回调

Javascript 完成嵌套数据库查询后进行回调,javascript,node.js,callback,Javascript,Node.js,Callback,我的nodejs应用程序一切正常,但由于嵌套的数据库查询,我无法知道进程是否完成 过程如下: function saveToDB(allData, callback) { var connection = mysql.createConnection({ host: 'localhost', user: 'root', database: 'node' }); [].forEach

我的nodejs应用程序一切正常,但由于嵌套的数据库查询,我无法知道进程是否完成

过程如下:

function saveToDB(allData, callback) {
       var connection = mysql.createConnection({
            host: 'localhost',
            user: 'root',
            database: 'node'
       }); 
       [].forEach.call( Object.keys( allData ), function( prop ){                                                 

            var conditions = {link: allData[prop]['link']};
            connection.query("SELECT link FROM articles WHERE ?", conditions, function(err, rows, fields) {
                if(rows.length < 1) { 
                    connection.query('INSERT INTO articles SET ?', {
                            link: allData[prop].link,
                            title: allData[prop].title,
                            description: allData[prop].description,
                            pubDate: allData[prop].pubDate
                    }, function(err, result){
                            if(err) throw err; 

                    }); 
                }           
            });   

            //Still there are some 
        }); 
}
函数saveToDB(所有数据,回调){
var connection=mysql.createConnection({
主机:“localhost”,
用户:'根',
数据库:“节点”
}); 
[]forEach.call(Object.keys(allData),function(prop){
var条件={link:allData[prop]['link']};
connection.query(“从文章中选择链接?”,条件,函数(错误,行,字段){
如果(rows.length<1){
connection.query('插入到项目集中?'{
link:allData[prop].link,
标题:allData[prop]。标题,
description:allData[prop]。description,
pubDate:allData[prop].pubDate
},函数(错误,结果){
如果(错误)抛出错误;
}); 
}           
});   
//还有一些
}); 
}
我想在循环和查询完成后调用
回调
,以便关闭
连接
或退出应用程序

有什么想法吗


我尝试使用库方法,但我不知道如何使用

脏溶液可以是计数器,在每次开始时递增,在结束后递减

function saveToDB(allData, callback) {
       var inProgress = 0;
       function done(){
           if( inProgress <= 0 ) callback();
       }
       var connection = mysql.createConnection({
            host: 'localhost',
            user: 'root',
            database: 'node'
       }); 
       [].forEach.call( Object.keys( allData ), function( prop ){                                                 
            inProgress++;
            var conditions = {link: allData[prop]['link']};
            connection.query("SELECT link FROM articles WHERE ?", conditions, function(err, rows, fields) {
                if(rows.length < 1) { 
                    connection.query('INSERT INTO articles SET ?', {
                            link: allData[prop].link,
                            title: allData[prop].title,
                            description: allData[prop].description,
                            pubDate: allData[prop].pubDate
                    }, function(err, result){
                            inProgress--;
                            if(err) throw err; 
                            done();

                    }); 
                }           
            });   

            //Still there are some 
        }); 
}
函数saveToDB(所有数据,回调){
var inProgress=0;
函数完成(){

如果(在程序中)需要
async.forEach
或使用
async.reduce
并创建一个大插入query@SLaks您的意思是使用
async.forEach
而不是
[].forEach
?谢谢。它可以工作。我将
进程中的
初始化移出了saveToDB()值为
var-inProgress=allData.length;
并将
inProgress--;done();
添加到第一个数据库查询结果的
else
部分。