尝试从内循环中获取数据,但是要延迟。
在代码中,我从sql表中获取用户列表及其祖先。我需要这些祖先来检查它们的根值(层次结构/树结构)。如果祖先角色是salesmanager,则为每个用户添加salesmanager名称。
不起作用的案例
如果用户本身是父级,则值会推送到数组中。 (工程)
如果用户有父(如user_id 3由user_id 2添加,2由1添加),则1为3的祖先。进入内循环。
值推送到同一个数组,如果在此数组中打印则显示,但如果在循环外打印则不显示
以下是代码:
var sql_query='SELECT *,GetAncestry(id) as anstry FROM users' //get ancestors using sql function
con.query(sql_query, function(err,rows) {
if(err) throw err;
if(rows) {
console.log('length rows'+rows.length) // prints 5
var rows_salesinfo=[]
var ancestors=[]
rows.forEach(function(rows) {
if(rows.anstry !='') {
var array = JSON.parse("[" + rows.anstry + "]");
} else {
var array = []
}
if(array.length > 0) {
// inner loop starts
con.query('SELECT id,role,firstname,lastname FROM users WHERE users.id IN ('+array+')', function(demoErr,demoRows) {
if(demoErr) throw demoErr;
if(demoRows.length > 0) {
var keepGoing = true;
demoRows.forEach(function(index,value,callback) {
if(keepGoing) {
if(index.role == 'sales_manager') {
console.log(rows.id)
rows.salesmanager = index.firstname+" "+index.lastname
rows_salesinfo.push(rows)
keepGoing = false;
}
}
console.log(rows_salesinfo) // this inner loop values print here
})
} else {
rows_salesinfo.push(rows)
}
})
} else {
console.log(rows.id) // works
rows.salesmanager=''
rows_salesinfo.push(rows) // works
}
})
console.log('6new')
console.log(rows_salesinfo) // works before response of inner loop
console.log('length rows_salesinfo'+rows_salesinfo.length) // length 3
}
})
答案 0 :(得分:0)
你的内部循环是回调函数。因此,只有在db级别执行con.query并返回结果后才会执行它。 .query是异步函数。您可以阅读有关回调和node.js事件循环here的信息。基本上,查询命令看起来像这样“嘿,db,请执行此命令,告诉我,结果准备就绪。之后我将执行我的回调函数。”当db运行您的查询时,javascript命令继续执行。 如果您希望在所有查询准备就绪后执行上一个日志,我建议您查看async.each函数。
所以,你的代码看起来像这样
async.each(rows,
function(row, callback) {
// Perform operation on row that you need
//run innex query and inner loop
con.query('some query', function(demoErr,demoRows) {
if(demoErr) callback(demoErr); //error will apear in final function
//demo rows foreach and if here
callback(); //execute callback without args to show that this function is finished
});
},
function(err) {
//check for err here
//and do final logs
console.log('6new')
console.log(rows_salesinfo)
console.log('length rows_salesinfo'+rows_salesinfo.length)
});
您需要运行
npm install --save async
项目目录中的