Неожиданное поведение с функцией закрытия - PullRequest
0 голосов
/ 30 марта 2012

Я вполне уверен, что это вопрос закрытия за десять пенни.Но прочитав несколько статей о замыканиях, я все еще не могу заставить это работать.

character всегда возвращается как 'Z'.character также является глобальной переменной.

Мне нужно "render", чтобы запомнить символ в цикле:

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);
    }
}

Ответы [ 4 ]

1 голос
/ 30 марта 2012
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));

Edit:

Кроме того, asawyer прав в своем комментарии выше - если вы используете node-mysql , он поддерживает параметризованные запросы:

database.query("SELECT * FROM foo WHERE bar = ?", [ 1 ]);

Используйте это и избавьте себя от неприятностей!

0 голосов
/ 30 марта 2012
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);
    }
}

Полагаю, это то, что вам нужно. добавить выделенные строки. веселит

0 голосов
/ 30 марта 2012

Используйте немедленно выполняемую функцию, которая возвращает функцию, которая вызывает render с параметрами:

database.query(sql, (function(nextChar) {
    return function(tx, result) {
        return render(tx, result, nextChar);
    };
})(nextChar));

Затем добавьте соответствующий параметр nextChar к render.

0 голосов
/ 30 марта 2012

Не проверено:

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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...