2012-03-29 2 views
1

Я создаю приложение javascript, используя объектно-ориентированные методы, и у меня возникает проблема, и я надеюсь, что кто-то здесь поможет мне решить.Возвращение массива из метода класса javascript в скрипт

Следующий метод предназначен для возвращения массива, заполненного рядами данных из базы данных веб-SQL:

retrieveAllStoreSearches : function(){ 
    this.db.transaction(
     function(transaction){ 
      transaction.executeSql(
       "SELECT name,store,address FROM searchResults ORDER BY name ASC", 
       [], 
       function(transaction, results){ 
        var returnArr = []; 
        for(var i = 0; i < results.rows.length; i++){ 
         var row = results.rows.item(i); 
         returnArr.push(row.name + ' | ' + row.address); 
        } 
        console.log('Length of returnArr: ' + returnArr.length); 
        console.log(returnArr); 
        return returnArr; 
       }, 
       this.errorHandler 
      ); 
     } 
    ); 
} 

Это работает точно так, как ожидается, при входе результатов на консоль, НО когда я пытаюсь вызвать Способ в следующем фрагменте (находится в другом сценарии - который инициализирует все объекты и отвечает за создание структуры и функциональные возможности приложения DOM)

console.log(db.retrieveAllStoreSearches()); 

неопределенными возвращается.

Я не могу понять, что я делаю неправильно, поскольку, когда я использовал возврат в методе, позволяющем получить доступ к объекту из одного класса и в другой скрипт, я никогда не сталкивался с какими-либо проблемами.

Может ли кто-нибудь указать какие-либо указания на то, что я могу сделать неправильно?

ответ

4

Невозможно сделать, если ваша функция вызывает асинхронную функцию, единственный способ вернуть результат через обратный вызов. В этом весь смысл асинхронных функций, остальная часть кода может продолжаться до завершения вызова. Это другой способ думать о возврате значений (без блокировки остальной части вашего кода).

Так вы должны изменить свой код к следующему (плюс надлежащей обработки ошибок)

retrieveAllStoreSearches : function(callback){ 
    this.db.transaction(
     function(transaction){ 
      transaction.executeSql(
       "SELECT name,store,address FROM searchResults ORDER BY name ASC", 
       [], 
       function(transaction, results){ 
        var returnArr = []; 
        for(var i = 0; i < results.rows.length; i++){ 
         var row = results.rows.item(i); 
         returnArr.push(row.name + ' | ' + row.address); 
        } 
        callback(returnArr); 
       }, 
       this.errorHandler 
      ); 
     } 
    ); 
} 

Затем вы можете использовать console.log как следующий

db.retrieveAllStoreSearches(function(records) { 
    console.log(records) 
}); 
+0

Хуан вы ARE человек! Это именно то, что мне нужно. Спасибо вам за помощь в решении этой «ошибки» и повышении моего обучения в процессе! Работает как сон :) – EinZweiDrei

Смежные вопросы