繁体   English   中英

Javascript全局变量问题

[英]Javascript Global variable problem

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

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

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


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. 最后这是问题所在:

$(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(),那么数据将填充所有信息。

任何想法我怎么能避免它?

我假设您正在进行异步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其他函数。

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()使其工作的原因是,暂停使响应有机会在其他警报运行之前返回。

问题是,如果在调用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);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM