javascript вложенные функции и переменные - PullRequest
0 голосов
/ 24 января 2012
function GetMe(id) {

DB.transaction(
    function (transaction) {

        transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {

            if(results.rows.length > 0) {

                var row = results.rows.item(0);

                return row.name;


            }

        }, errorHandler);
    }
);

}

alert(GetMe(1)); // id 5 exists in users table and alert shows empty

приведенный выше код не работает, поэтому я попробовал приведенные ниже коды

function GetMe(id) {

var retval;

DB.transaction(
    function (transaction) {

        transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {

            if(results.rows.length > 0) {

                var row = results.rows.item(0);

                retval = row.name;
                //alert('IN ' + retval); //works

            }

        }, errorHandler);
    }
);

//alert('OUT ' + retval); // undefined

return retval;  // undefined

}

alert(GetMe(1));  // undefined

приведенный выше код должен работать нормально, но это не так, я не знаю, что с ним не так, я попробовал почти все

Может кто-нибудь сказать мне, что не так, и помочь мне исправить это спасибо:)

Ответы [ 2 ]

1 голос
/ 24 января 2012

Это похоже на то, что DB.transaction является асинхронным . Вам нужно будет передать обратный вызов function на GetMe() function, например,

GetMe(1, function (data) {

});

А затем измените GetMe следующим образом:

function GetMe(id, callback) {
    DB.transaction(function (transaction) {
        transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {
            if(results.rows.length > 0) {
                var row = results.rows.item(0);
                callback.call(null, row.name);
            }
        }, errorHandler);
    });
}
0 голосов
/ 24 января 2012

Проблема не во вложенной функции, а в том, что внутренняя функция (переданная в transaction.executeSql) не выполняется, когда вы думаете, что это происходит.Последовательность больше похожа на следующую:

  1. Запуск GetMe
  2. Вызов DB.transaction и обратный вызов, переданный в
  3. DB.transaction возвращает
  4. GetMe возвращает (ничего)
  5. Первый обратный вызов выполняется в какой-то неизвестной последующей точке
  6. Затем вызывается executeSql, а другой обратный вызов передается в
  7. executeSQL возвращает
  8. обратный вызов возвращает (ничего)
  9. Затем выполняется второй обратный вызов (после запуска SQL) и возвращает row.name, но ни к чему, остальная часть программы, уже зарегистрировавшейся в журнале, перешла.

Tl; dr: Вы должны вызывать другую объявленную функцию, а не передавать обратный вызов:

// inside GetMe
transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], GotMe);

// outside, in the same scope as GetMe
function GotMe(transaction, results) {
    // do your stuff here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...