我相当确定这是一个十便士关闭问题。但是,阅读了一些关于闭包的文章,我仍然无法让它工作。
character
始终返回为“Z”。 character
也是一个全局变量。
我需要“渲染”来记住循环中的字符:
populateList: function()
{
var render = function(tx, result)
{
console.log(character);
for (var i = 0; i < result.rows.length; i++)
{
var contact = result.rows.item(i);
console.log(contact.Name);
}
}
var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(var i = 0; i < str.length; i++)
{
var nextChar = str.charAt(i);
database.open();
var sql = "SELECT Name FROM Contact WHERE Name LIKE \'" + nextChar + "%\' ORDER BY Name";
database.query(sql, render);
}
}
答案 0 :(得分:1)
var render = function(character)
{
return function(tx, result)
{
console.log(character);
for (var i = 0; i < result.rows.length; i++)
{
var contact = result.rows.item(i);
console.log(contact.Name);
}
}
}
用法:
database.query(sql, render(nextChar));
修改强>
此外,asawyer在上面的评论中是正确的 - 假设您使用node-mysql,它支持参数化查询:
database.query("SELECT * FROM foo WHERE bar = ?", [ 1 ]);
使用它并省去一些麻烦!
答案 1 :(得分:0)
未测试:
populateList: function()
{
var render = function(char)
{
console.log(char);
return function(tx, result) {
for (var i = 0; i < result.rows.length; i++)
{
var contact = result.rows.item(i);
console.log(contact.Name);
}
};
}
var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(var i = 0; i < str.length; i++)
{
var nextChar = str.charAt(i);
database.open();
var sql = "SELECT Name FROM Contact WHERE Name LIKE \'" + nextChar + "%\' ORDER BY Name";
database.query(sql, render(nextChar));
}
}
答案 2 :(得分:0)
使用一个立即执行的函数,该函数返回一个函数,该函数使用以下参数调用render
:
database.query(sql, (function(nextChar) {
return function(tx, result) {
return render(tx, result, nextChar);
};
})(nextChar));
然后将相应的nextChar
参数添加到render
。
答案 3 :(得分:0)
var render = function(tx, result)
{
console.log(character);
***var char = character;***
for (var i = 0; i < result.rows.length; i++)
{
var contact = result.rows.item(i);
***console.log(char);***
console.log(contact.Name);
}
}
我想这就是你需要的。添加突出显示的行。欢呼声