2015-10-05 7 views
0

У меня есть небольшая функция.Массив не заполняется

По существу, он выполняет поиск в WebSQL для пользователей, имеющих день рождения на конкретную дату.

Моя проблема в том, что она регистрирует пользователей с console.log(user) и я могу увидеть выход, но как-то массив пользователей пуст, хотя я нажимаю пользователей к нему users.push(user).

Для меня это кажется как массив users не доступен в коде (но я не получаю никаких ошибок)

Что я не так? Спасибо!

compare_dates_with_users: function(dates){ 
    var users = []; 
    var dates_string = this.prepare_dates_for_query(dates); 

    this.get_database().transaction(function(t) { 
     t.executeSql("SELECT * FROM user WHERE birthday IN (" + dates_string.join(', ') + "); ", [], function(tx, results){ 

      var len = results.rows.length, i; 
       for (i = 0; i < len; i++) { 
       var user = results.rows.item(i); 
        user.f_date = true; 

        console.log(user); 

        users.push(user); 
       } 

     }); 
    }); 

    return users; 
}, 
+3

Это асинхронная задача? «Пользователи» будут возвращены до совершения транзакции – baao

ответ

2

Выполнение вашей базы данных - задача async. Вы должны использовать обратный вызов, когда выполнение SQL завершено, и возвращает массив пользователей. Затем он будет заполнен.

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


Редактировать

Как кто-то отметил, вы можете также использовать обещание.

Пример использования обратного вызова:

compare_dates_with_users: function(dates, callback){ 
    var users = []; 
    var dates_string = this.prepare_dates_for_query(dates); 

    this.get_database().transaction(function(t) { 
     t.executeSql("SELECT * FROM user WHERE birthday IN (" + dates_string.join(', ') + "); ", [], function(tx, results){ 

      var len = results.rows.length, i; 
       for (i = 0; i < len; i++) { 
       var user = results.rows.item(i); 
        user.f_date = true; 

        console.log(user); 

        users.push(user); 
       } 

      callback(users); 
     }); 
    }); 
}, 

Вызов функции:

compare_dates_with_users(dates, function(users){ 
    //Users is now populated 
    console.log(users); 
}); 
1

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

return users; 

. Это приводит к тому, что результат будет пустым массивом, даже если каждый элемент пользователя не пуст или не равен нулю.

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

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