в WebOS мне нужен метод, который, используя входные данные, будет выполнять команду выбора sql и возвращает результаты в виде массива - PullRequest
1 голос
/ 07 июня 2011

Итак, субъект говорит обо всем, но здесь более подробно. Я хотел бы создать метод, который, когда передается набор значений, он вставляет эти значения в sql select statment, а затем возвращает результаты. Я работаю над приложением webOS, поэтому структура для вызова базы данных sqlite такова:

function getSQLresults(input){
    this.db.transaction(function(transaction) {
         transaction.executeSql(
             theSql,
             parmAry,
             function(transaction, results) {}, //this is the on success function
             function(transaction, error) {} //this is the on failure function
         );
    }.bind(this));
};

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

var sqlResults = getSQLresults(varToSend);

Может кто-нибудь объяснить, как заставить это работать?

1 Ответ

1 голос
/ 07 июня 2011

Предполагая, что вы не очень хорошо разбираетесь в JavaScript, вы захотите ознакомиться с асинхронным программированием и обратными вызовами, так как это действительно суть JavaScript.Когда ваша функция getSQLresults выполняется, она сначала запускает асинхронную функцию с помощью this.db.transaction, который, по сути, просит БД установить транзакцию и выполнить обратный вызов после ее установления.Непосредственно после (функция (транзакция) {....}) вы увидите, что это новая функция, которая передается функции db.transaction в качестве обратного вызова в форме параметра.Как только БД установит транзакцию, он выполнит эту функцию обратного вызова.

Когда это произойдет, вызывается новая асинхронная функция, которая называется "action.executeSql ", которая запрашивает транзакцию, которую вы ранее установили, для выполненияЗапрос SQL и возврат результатов (или ошибка).Вы заметите, что после параметров «theSql» и «parmAry» вы передаете две новые функции.Оба из них также известны как обратные вызовы.Они являются функциями, переданными в функцию «action.executeSql »в качестве параметров, которые будут вызваны после завершения функции.

Ключом ко всему этому является то, что это происходит асинхронно, а не синхронно, то есть программа нене останавливайся и жди ответа.Программа запустит эти события и продолжит работу (и ВОЗВРАЩАЕТСЯ из функции getSQLresults) до того, как будут выполнены другие функции.Таким образом, вы не можете просто присвоить значение результатам этой функции и ожидать получить значимый результат.Вместо этого, поскольку вы имеете дело с асинхронными функциями, вам также придется следовать стилю асинхронного программирования.Чтобы сделать это, вам просто нужно передать свой СОБСТВЕННЫЙ обратный вызов, который будет выполнен после завершения транзакций sql .......

function getSQLresults(input, callback){ // <---- new callback param
    this.db.transaction(function(transaction) {
         transaction.executeSql(
             theSql,
             parmAry,
             function(transaction, results) { 
                  // Execute the callback function, passing in our results
                  callback(results); 
             }, //this is the on success function
             function(transaction, error) {} //this is the on failure function
         );
    }.bind(this));
};

// Setup a callback function to pass INTO getSQLresults as a parameter.
function fnToExecuteForCallback(results) {
     // The results from the "transaction.executeSql" statement will now 
     // be available here, as they were passed in by executing this 
     // callback function - which is the "callback" parameter passed 
     // into getSQLresults...
}

var someInput = "???";

// Call the getSQLresults function, passing in our input and callback function.
getSQLresults(someInput, fnToExecuteForCallback);
...