Согласно моим комментариям, вы должны вернуть закрытую функцию для правильного связывания параметра.
Гораздо более простым примером является следующее:
При выполнении этого выдается 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
значение, которое было сохранено при закрытии.Обратите внимание, что 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)
in. Эта функция вызывается сразу через (id)
и возвращаетфункция, которая принимает tx
и results
в качестве аргументов и выполняет соответствующее действие.
Я проверил фигурные скобки / скобки, но у меня нет прямого способа проверить, что я не сделал опечаток.