如何使用JavaScript控制数据库查询的响应顺序

How to control the response order of a database query with JavaScript

本文关键字:查询 响应 顺序 数据库 控制数据 何使用 JavaScript 控制      更新时间:2023-09-26

我有两个嵌套的数据库查询:

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