我有两个嵌套的数据库查询:
db.query(query1, function (err, rows, fields) {
if (!err) {
console.log("outer rows.length: " + rows.length);
function outer() {
for (var i = 0; i < rows.length; i++) {
console.log(i + ". outer row");
function inner() {
db.query(query2 + i + 1, function (error, r, f) {
if (!error) {
for (var j = 0; j < r.length; j++) {
console.log(j + ". inner row");
}
}
});
};
inner();
}
}
outer();
}
});
我希望日志顺序为......
outer rows.length: 2
0. outer row
0. inner row
1. inner row
1. outer row
0. inner row
但是我得到了这个结果:
outer rows.length: 2
0. outer row
1. outer row
0. inner row
1. inner row
0. inner row
有两个属于0. outer row
的内行和一个属于1. outer row
的内行。
此代码首先记录所有外部行,然后记录所有内部行。
我正在寻找防止这种情况的方法。
我认为,问题在于代码的异步性。
我试图通过将function inner()
置于具有样式( function inner() { .. } )();
的立即调用函数来修复它,但这并没有改变任何东西。
如何确定每个内部行将在其对应的外部行之后立即记录,就像在第一个列表中一样?
任何建议将不胜感激。
修改
使用node-mysql模块在Node.js中使用服务器端JavaScript。
答案 0 :(得分:-1)
NodeJS的异步功能肯定会影响您的代码,您需要在查询中创建一个回调,然后在查询完成后输出响应,如果您想让它成为异步(您可能会这样做)< / p>
在NodeJS网站上有很多关于如何使用回调进行反向呼叫的例子。
这是一个例子:
function formSubmit(submitEvent) {
var name = document.querySelector('input').value
request({
uri: "http://example.com/upload",
body: name,
method: "POST"
}, postResponse)
}
function postResponse(err, response, body) {
var statusMessage = document.querySelector('.status')
if (err) return statusMessage.value = err
statusMessage.value = body
}
exports.submit = formSubmit