JS функция для подсчета строк в таблице SQLite - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь создать функцию JS, которая подсчитывает строки в таблице SQLite.

function countRows(){
    db.transaction(function (tx){
        tx.executeSql('SELECT id FROM table', [], function (tx, results) {
            var len = results.rows.length;
            alert(len);
        });
    });
}

Приведенный выше код отображает предупреждение с номерами строк в таблице. Однако я хотел бы создать функцию, которая бы возвращала число вместо отображения окна с предупреждением.

Я пытался:

function countRows(){
    db.transaction(function (tx){
        tx.executeSql('SELECT id FROM table', [], function (tx, results) {
            var len = results.rows.length;
            return len;
        });
    });
}

А потом:

var number = countRows();
alert (number); // returns "undefined"

Приведенный выше пример возвращает "undefined", тогда как параллельный пример работает нормально:

function count(){
    return 3;
}
var number = count();
alert (number); // returns 3

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

В PHP это будет:

$sql1 = mysql_query('SELECT COUNT(*) FROM table1');
$rows1 = mysql_result($sql1, 0);
$sql2 = mysql_query('SELECT COUNT(*) FROM table2');
$rows2 = mysql_result($sql2, 0);
if ($row1>$row2){}

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

db.transaction является асинхронным. возвращаемое значение не присваивается ни одной переменной в коде выше. Решение состоит в том, чтобы передать обратный вызов или создать пользовательское событие, которое почти совпадает.

Примерно так:

function countRows(cb){
    db.transaction(function (tx){
        tx.executeSql('SELECT id FROM table', [], function (tx, results) {
            var len = results.rows.length;
            cb.call(this, len);
        });
    });
}

countRows(function (num) {alert(num)});
2 голосов
/ 22 марта 2012

Если вы измените свой запрос, вам будет гораздо лучше.

SELECT COUNT(ID) FROM table

Кроме того, это асинхронный вызов, так что вызов return возвращает функцию обратного вызова. Вы должны передать свою собственную функцию обратного вызова.

function countRows(callback){
    db.transaction(function (tx){
        tx.executeSql('SELECT id FROM table', [], function (tx, results) {
            var len = results.rows.length;
            callback(len);
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...