асинхронный обратный вызов в методе объекта для операций базы данных JavaScript - PullRequest
2 голосов
/ 04 января 2012

Я хотел бы инкапсулировать команды базы данных SQLite в класс DBManager.Чтобы прочитать данные, я написал следующие строки:

DBManager.prototype.readMyData = function(param1, param2) {
this.db.transaction(function(tx) {
    tx.executeSql("SELECT * FROM myTable WHERE param1 <= ?",
    [param1],
    function(tx, result) {
      var myData = [];
      for (var i=0; i<result.rows.length; i++) {
                var row = result.rows.item(i);
                myData.push(row);
              }
    },
    errorHandler);
});
    return myData;

}

Проблема: Если я вызываю метод readMyData (), команда return выполняется перед методом транзакции иего внутренний материал.

Как я могу справиться с этим, чтобы возвращаемое значение readMyData() не было пустым, а содержало массив myData?

1 Ответ

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

Вы не можете, вы должны предоставить обратный вызов readMyData:

DBManager.prototype.readMyData = function(param1, param2, callback) {
    this.db.transaction(function(tx) {
        tx.executeSql("SELECT * FROM myTable WHERE param1 <= ?", [param1],
            function(tx, result) {
                var myData = [];
                for (var i=0; i<result.rows.length; i++) {
                    var row = result.rows.item(i);
                    myData.push(row);
                }
                callback(myData);  // <- passing the data to the callback
            },
            errorHandler);
    });
}

, а затем вызвать его с помощью:

db.readMyData(foo, bar, function(result) {
   // work with result here
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...