Web db - получение данных обратно - PullRequest
0 голосов
/ 10 января 2011

Вот код

    onError = function(tx, e) {
        alert('Something unexpected happened: ' + e.message );
    }

    var webdb = openDatabase(dbName, '1.0' , dbDesc , dbSize);

    var colourArray = new Array();

    webdb.transaction(function(tx) {
        tx.executeSql('SELECT * FROM colours', 
                      [], 
                      function(tx,rs) {
                        var ctn = rs.rows.length;
                        for (var i=0; i < ctn; i++) {
                            var row = rs.rows.item(i);                
                            colourArray.push([row.id , row.title]);
                        }   
                      }, 
                      onError);
    });
    /**
     * the array looks like [[1,'red'],[2,'white'],[3,'black'] ...]
     */
     var ColourStore = new Ext.data.ArrayStore({fields: ['key', 'val'],
                                               data: colourArray});

Таблица "colors" содержит название цвета и хэш-код. И предполагалось, что он будет использоваться ExtJS Ext.data.ArrayStore, а затем заполнит другие выпадающие списки в массивной форме.

Моя проблема в том, что я не могу вернуть данные в виде массива. Переменная "colourArray" пуста ... Я знаю, что столкнулся с некоторым закрытием javascript, проблемой цикла ... но просто не мог понять, как вернуть значение внутреннего цикла. Попробуйте много функций return -> return -> return и больше return. Ни один из них не работает.

1 Ответ

0 голосов
/ 13 января 2011

executeSQL является асинхронным.Вам необходимо создать ColourStore в функции обратного вызова функции (tx, rs).Если вам нужны данные, доступные в глобальном масштабе, вы не сможете запустить приложение, пока executeSQL не вызовет функцию обратного вызова.Пример:

Ext.onReady( function() {
    var webdb = openDatabase(dbName, '1.0' , dbDesc , dbSize);

    var colourArray = new Array();
    var ColourStore;

    webdb.transaction( function(tx) {
        tx.executeSql('SELECT * FROM colours',
        [], function(tx,rs) {
            var ctn = rs.rows.length;
            for (var i=0; i < ctn; i++) {
                var row = rs.rows.item(i);
                colourArray.push([row.id , row.title]);
            }
            //INIT YOUR APP HERE IN ORDER TO HAVE ACCESS TO colourArray values
            ColourStore = new Ext....
            YourApp.init();
        },
        onError);
    });
}, this);
...