我现在正在学习面向对象的 JavaScript,并尝试从用于 HTML5 SQLite 的 DB 类构建文字对象。
问题是,在某一点上,某些方法没有按正确的顺序执行,这是我需要的。这是课程:
var DB = function(dbName, dbVersion, dbDescription, dbSize){
var dbConnection = null;
var is_connected = false;
var dbName = dbName;
var dbVersion = dbVersion;
var dbDescription = dbDescription;
var dbSize = dbSize;
var existingTables = new Array();
var connect = function(){
Debug.log('auto connect ...');
try{
if (!window.openDatabase) {
Debug.log('SQLite not supported');
}
else{
dbConnection = window.openDatabase(dbName, dbVersion, dbDescription, dbSize);
is_connected = true;
}
}
catch(e){
if (e == INVALID_STATE_ERR) {
// Version number mismatch.
Debug.log("Invalid database version.");
}
else{
Debug.log(e.message);
}
return;
}
}();
var checkTables = function(){
dbConnection.transaction(function (tx) {
tx.executeSql('SELECT name FROM sqlite_master WHERE type="table"', [], function(tx, rs) {
for( var i = 0; i < rs.rows.length; i++ ) {
Debug.log(rs.rows.item(i).name);
existingTables.push( rs.rows.item(i).name );
}
}, function (tx, err){
Debug.log(err.message);
return true;
});
});
}();
// public methods
return {
isConnected : function(){
return is_connected;
},
close : function(){
// close the DB connection
},
tableExists : function(table){
Debug.log('table: '+table);
// existingTables == 0 - WHY?
alert(existingTables.length);
},
tableCreate : function(table){
switch(table){
case 'foo':
var cr_sql = 'CREATE TABLE foo (id unique, text)';
break;
}
// create the missing table
dbConnection.transaction(function (tx) {
tx.executeSql(cr_sql, [], function(tx, rs) {
return true;
}, function (tx, err){
Debug.log(err.message);
return true;
});
});
},
dbConnection : dbConnection
}
};
执行:
var DBFactory = {
getConnectionforApp: function(){
try{
var db_instance = new DB('mydb', '1.0', 'DB Connection 1', 1024*1024);
Debug.log('Connected to db: '+db_instance.isConnected());
return db_instance;
}catch(e){
Debug.log(e.message);
}
}
};
// the example
var dbObj = DBFactory.getConnectionforApp();
alert(dbObj.tableExists('foo'));
当我执行此代码时,公共方法 tableExists 会给我一个警报,即 existingTables.length = 0 ,但我从函数中的对象开始添加此数组中的所有现有表:checkTables()。
- 为什么这个数组existingTables在函数tableExists中是空的?
- 为什么函数 tableExists 在函数 checkTables 之前执行?
是否有可能制作一些construct() 函数,在创建对象时首先调用它,然后再调用所有其他函数?