为什么我无法在交易中访问'i'变量? 的console.log(数据);成功输出数据。 的console.log(数据[I]);说undefined ..
for(var i = 0; i < data.length ; i++){
db.transaction(function(tx){
console.log(data);
console.log(data[i]);
tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[i].id], function(tx, results){
//do something
});
});
}
答案 0 :(得分:1)
为什么我无法在交易中访问'i'变量?
你可以,但它没有你期望的价值。循环完成后,事务回调称为稍后。该回调具有对变量 i
的持久引用,而不是创建回调时其值的副本,因此它看到i
的值为data.length
}。因此,您undefined
获得了data[i]
。
对于这种情况,我通常使用构建器函数,因此回调将关闭一个不会更改的变量:
for (var i = 0; i < data.length; i++) {
db.transaction(buildHandler(i));
}
function buildHandler(index) {
return function(tx) {
console.log(data);
console.log(data[index]);
tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[index].id], function(tx, results) {
//do something
});
};
}
这是有效的,因为buildHandler
创建的函数会保留对index
的引用,而index
永远不会更改。
或者,在特定的情况下,你可以很好地利用Array#forEach
,因为它已经为你提供了一个不会改变的变量(嗯,一个参数): / p>
data.forEach(function(entry, index) {
db.transaction(function(tx) {
console.log(data);
console.log(data[index]);
tx.executeSql('SELECT * FROM REGISTERED_EVENTS where EVENT_ID = ?', [data[index].id], function(tx, results) {
//do something
});
});
});