我有两个嵌套的数据库查询:
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.js中使用Node-mysql模块的服务器端JavaScript。
这肯定是NodeJS的异步功能。影响您的代码时,您需要在查询中创建一个回调,然后在查询完成后输出响应,如果您希望异步(您可能会这样做)
NodeJS网站上有关于如何使用回调进行ansychroneous调用的很好的例子。
这里有一个例子:
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