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

时间:2015-03-26 22:56:40

标签: javascript database node.js asynchronous node-mysql

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

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。

1 个答案:

答案 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