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

标签 javascript sql database html

在下面列出的查询中,我的 for 循环正在执行 4 个值。在第一个警报(id)中,它警告这 4 个不同的值。但是,在嵌套查询中,警报语句仅打印最后一个 id 值,4x 具有不同的 max(b.id) 值。我很困惑。有谁知道可能会发生什么?可能会发生竞争条件吗?

我的目标是在嵌套查询中放置 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); });

最佳答案

根据我的评论,您应返回一个封闭函数以正确绑定(bind)参数。

一个更简单的示例如下:

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

for (i=0;i<4;i++) {
    setTimeout( function() { alert(i)}, 1000);
}

运行此命令会产生 4 个警报,分别显示 0/4、1/4、2/4、3/4。

for (i=0;i<4;i++) {
    setTimeout(function(inneri) { 
        return( 
            function() { 
                alert(inneri + "/" + i);
            }
        );
    }(i), 1000);
}

我命名为inneri的地方关闭时保留的值(value)。请注意,i 本身仍然指的是外部作用域,因此是 4(这是执行时的真实值,因为这是 i 转储出 for 循环时的值,因为我们正在延迟使用 setTimeout() 执行。

第一种情况是您正在做的事情的简单版本,而您想要第二种情况。

重写你的js(并希望我得到所有这些(和{在正确的位置:))给出:

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)

在。该函数通过 (id) 立即调用并返回一个函数,该函数接受 txresults作为参数并执行适当的操作。

我已经检查了大括号/圆括号,但没有直接的方法来验证我没有犯任何拼写错误。

关于javascript - 处理整个 For 循环后发出嵌套 HTML5 Web SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9623843/

相关文章:

sql - 加速使用 exists 的 sql 查询

mysql - 根据查找表搜索并替换超过 500.000 行中的多个单词

mysql - SQL查询: Alter columny value if columnx value is greater,小于或等于

javascript - 传播复杂对象的语法

javascript - 如何在我的案例中创建加载屏幕

javascript - Jquery选择器-根据属性值获取元素

javascript - 如何在 Bootstrap 表中输入文件旁边的列中放置按钮

sql - Azure SQL 数据库在本地运行时可以工作,但在发布到 Azure 时则无法工作

mysql - 尝试制作一个可以加密以确保安全的 Mysql 密码表,然后在用户需要重置忘记的密码时重置

Android - 解析查询以获取所有帖子和用户与帖子一起去