Javascript 处理整个For循环后发出的嵌套HTML5 Web SQL查询

Javascript 处理整个For循环后发出的嵌套HTML5 Web SQL查询,javascript,sql,database,html,Javascript,Sql,Database,Html,在下面列出的这个查询中,我的for循环正在执行4个值。在第一个alertid中,它会提醒这4个不同的值。但是,在嵌套查询中,alert语句仅打印最后一个id值,即使用不同maxb.id值的4x。我很困惑。有人知道会发生什么吗?是否会发生种族状况 我的目标是在嵌套查询中放置一个Ajax调用,该查询具有基于id和b.id的输入值。我目前正在这样做,但是ajax调用中id的值对于所有4个不同的调用都是相同的,这会弄乱返回数据。谢谢 database.db.transaction(function (t

在下面列出的这个查询中,我的for循环正在执行4个值。在第一个alertid中,它会提醒这4个不同的值。但是,在嵌套查询中,alert语句仅打印最后一个id值,即使用不同maxb.id值的4x。我很困惑。有人知道会发生什么吗?是否会发生种族状况

我的目标是在嵌套查询中放置一个Ajax调用,该查询具有基于id和b.id的输入值。我目前正在这样做,但是ajax调用中id的值对于所有4个不同的调用都是相同的,这会弄乱返回数据。谢谢

database.db.transaction(function (tx) {
            tx.executeSql('SELECT id, name from programs d', [], function (tx, results) {
                for (var i = 0; i < results.rows.length; i++) {
                    var id = results.rows.item(i)['id'];
                    var name = results.rows.item(i)['name'];
                        alert(id);

                    tx.executeSql('SELECT max(b.id) + 1 max from people b where b.sid = ?',
                        [id],
                        function (tx, results) {
                            lastRecord = results.rows.item(0)['max'];
                            alert(id + "last rec: " + name);
                        }
                    );
                }
            },
            function (event) { alert(event.message); });

根据我的评论,您需要返回一个封闭函数来正确绑定参数

下面是一个简单得多的示例:

运行此命令将生成4个警报,全部显示4个:

for (i=0;i<4;i++) {
    setTimeout( function() { alert(i)}, 1000);
}
我在此处插入:

 function(innerId) { 
    return (
         function (tx, results) {
             lastRecord = results.rows.item(0)['max'];
             alert(innerId + "last rec: " + name);
         }
    );
 }(id)
在。此函数通过id立即调用,并返回一个函数,该函数将tx和结果作为参数并执行相应的操作


我已经检查了大括号/括号,但是没有直接的方法来验证我没有输入任何错误。

你能澄清一下吗?第二个tx.executeSql中使用的[id]始终是第一个查询结果集中的最后一个,这是您的问题吗?是的,这就是发生的情况:我的问题是第一个嵌套查询tx.executeSql“SELECT max…”的查询执行正确。但在此警报范围内,alertid+last rec:+name id仅显示为最后一个元素。这导致第一个嵌套查询中的嵌套Ajax调用在3/4的情况下失败。我对第一个嵌套循环中的I值执行了console.log选择max…,它显示I=4。4次。我希望它显示为0 1 2 3,但似乎外部for循环在嵌套sql的回调执行之前执行。是的,这是正确的-在第二个executeSQL函数完成并触发其回调函数时,您已经完全遍历了该循环,并且I=4。所以这将是永久性的-为了保留值,您应该将其作为参数传递到回调函数中。
database.db.transaction(function (tx) {
      tx.executeSql('SELECT id, name from programs d', [], function (tx, results) {
            for (var i = 0; i < results.rows.length; i++) {
                var id = results.rows.item(i)['id'];
                var name = results.rows.item(i)['name'];
                alert(id);

                tx.executeSql('SELECT max(b.id) + 1 max from people b where b.sid = ?',
                    [id],
                    function(innerId) { 
                       return (
                          function (tx, results) {
                                lastRecord = results.rows.item(0)['max'];
                                alert(innerId + "last rec: " + name);
                          }
                       );
                    }(id) //be careful to avoid the ";" here!
                );
            }
        },
        function (event) { alert(event.message); 
    });
 function(innerId) { 
    return (
         function (tx, results) {
             lastRecord = results.rows.item(0)['max'];
             alert(innerId + "last rec: " + name);
         }
    );
 }(id)