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