Javascript 完成嵌套数据库查询后进行回调
我的nodejs应用程序一切正常,但由于嵌套的数据库查询,我无法知道进程是否完成 过程如下: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
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
部分。