我正在尝试在循环包含的executeSql函数中使用循环变量。但是如果我不使用闭包,循环变量会得到最后一个值。当我使用闭包时,我没有从executeSql函数获取结果列表。例子:
for (var i = 0; i < count; i++) {
tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [],
function(tx,results) //success function
{
//do something
}
,errorfunction);
}
成功功能“i”始终为“count + 1”。
为了解决这个问题,我改变了我的代码:
for (var i = 0; i < count; i++) {
tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [],
(function(tx,results) //success function
{
//do something
})(i)
,errorfunction);
}
有了这个,我就得到了“我”。但“结果”尚未定义。
我试图像这样传递“tx”和“i”:
(function(tx,results) //success function
{
//do something
})(tx,null,i)
有了这个我理解为什么我得到“结果”为null。我想学习如何获得executeSql的正确结果。
答案 0 :(得分:3)
您正在寻找以下内容:
for (var i = 0; i < count; i++) {
tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [],
(function(i){
return function(tx,results) //success function
{
//do something
};
})(i),
errorfunction);
}
在一天结束时,您需要传递签名function(tx,res)
的功能,这显然是整个(function(i){ return function(tx,res){ ... }; })(i)
的功能,因为外部匿名函数立即执行并返回该签名的函数
当调用外部函数时(即每次迭代的值),该内部函数中的值i
具有值i
,因为值i
是按值传递的进入外部匿名函数,因此返回的内部函数中对i
的引用将正确解析。