Javascript全局变量问题

时间:2010-11-11 20:18:09

标签: javascript jquery sqlite

首先我知道WebKit不允许对SQLite数据库进行同步请求。我开始玩它并尝试将结果分配给全局变量“data”。我仍然不确定是否可能,但想问你。

  1. 我创建了全局对象来存储来自DB的响应

    var data = {};
  2. 这是DB class

  3. 
    var db = {
            mydb: false,
            init: function () {
                try { 
                    if (!window.openDatabase) { 
                        alert('not supported'); 
                    } else { 
                        this.mydb = openDatabase('test_db', '1.0', 'Test DB', 1024*1024*5); 
                    }
                } catch(e) { 
                    // Error handling code goes here. 
                    if (e == INVALID_STATE_ERR) { 
                        // Version number mismatch. 
                        alert('Invalid database version.'); 
                    } else { 
                        alert('Unknown error '+e+'.'); 
                    } 
                    return; 
                }
            },
            exec: function (query, params) {
                try {
                    this.mydb.transaction(function(transaction) {
                        transaction.executeSql(query, params, db.dataHandler, db.errorHandler);
                    });
                } catch(e) {
                    alert(e.message);
                }
            },
            dataHandler: function (transaction, results) {
                // Handle the results
                data = results.rows;
                return true;    
            },
            errorHandler: function (transaction, error) {
                // returns true to rollback the transaction
                alert('Code: '+error.code+'\nMessage: '+error.message);
                return true;
            },
        }
    
    1. 最后是问题:
    2. 
      $(function () {
          db.init();
          db.exec('SELECT * FROM errors;');
          alert(Log.object_toString(data) ); // this alert show empty object as I declared in first line 
          alert(Log.object_toString(data) ); // this one return object with responded data from database
      });
      

      所以问题是我无法在db.exec()调用后立即使用“数据”进行操作,但是如果我在事务之后生成alert(),那么数据将填充所有信息。

      任何想法如何避免它?

2 个答案:

答案 0 :(得分:3)

我会假设您正在进行异步 AJAX 调用,因此您的alert()会在收到回复之前触发。

编辑: 正如@Nick所说,这不是AJAX,但它是异步的问题。

我对您使用的API一无所知,但似乎您的警报应该在dataHandler方法中:

dataHandler: function (transaction, results) {
    // Handle the results
    data = results.rows;
    alert(Log.object_toString(data) ); 
    alert(Log.object_toString(data) );
    return true;    
},

或者应该是从dataHandler内部调用的其他函数。

dataHandler: function (transaction, results) {
    // Handle the results
    data = results.rows;
    someFunction( data );
    return true;    
},

// ...

function someFunction( data ) {
    alert(Log.object_toString(data) ); 
    alert(Log.object_toString(data) );
}

中间alert()使其工作的原因是,暂停使响应有机会在其他警报运行之前返回。

答案 1 :(得分:1)

问题是,如果在调用exec后立即访问数据,则尚未调用dataHandler回调。确保您实际从查询中收到数据的唯一方法是在回调本身内处理它。为此你可以重新设计你的类,以允许exec函数实际上也采用一个回调函数,一旦查询成功执行就会被调用,例如

exec: function (query, params, onSuccess /*, onFailure*/) {
    try {
        var onFailure = arguments[3] || function(){};
        this.mydb.transaction(function(transaction) {
             transaction.executeSql(query, params, onSuccess, onFailure);
        });
    } catch(e) {
        onFailure(e);
    }
}

然后你可以这样调用你的db.exec:

db.exec('SELECT * FROM erros;', null, function(rows) {
    alert(Log.object_toString(rows));
}, function() {
    var error = arguments[0] || {message: 'Unknown Exception'};
    alert('An error occured: ' + error.message);
});