在下面列出的查询中,我的 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)
立即调用并返回一个函数,该函数接受 tx
和results
作为参数并执行适当的操作。
我已经检查了大括号/圆括号,但没有直接的方法来验证我没有犯任何拼写错误。
关于javascript - 处理整个 For 循环后发出嵌套 HTML5 Web SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9623843/