в webOS мне нужен метод, который, используя ввод, выполнит команду выбора sql и вернет результаты в виде массива

Итак, в теме все сказано, но здесь подробнее. Я хотел бы создать метод, который при передаче набора значений вставляет эти значения в статус выбора sql, а затем возвращает результаты. Я работаю над приложением для 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);

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


person user785178    schedule 07.06.2011    source источник


Ответы (1)


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

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

Ключ ко всему этому в том, что это происходит асинхронно, а не синхронно, то есть программа не останавливается и не ждет ответа. Программа запустит эти события и продолжит работу (и RETURNing из функции 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);
person WesleyJohnson    schedule 07.06.2011
comment
ну это как раз то, чего я боялся. Я подумал, что если я подожду секунду для результата, это будет хороший хак, чтобы обойти это. На самом деле я провел большую часть вечера, пытаясь придумать другой метод, используя обратные вызовы, как я это делал, и теперь вы только что подтвердили, что я ДОЛЖЕН сделать это таким образом. Спасибо! - person user785178; 07.06.2011